Skip to main content

Subrequests for Zope2

Project description

Overview

plone.subrequest provides a mechanism for issuing subrequests under Zope2.

Installation

Plone 4

An entry point is provided so no special installation is required past adding plone.subrequest to your instance’s eggs.

Zope 2.12 without Plone

Load this package’s ZCML in the usual manner.

Zope 2.10

You must install ZPublisherEventsBackport to use this package with Zope 2.10 and load both package’s ZCML. The tests require Zope 2.12 / Python 2.6 so will not run.

Usage

Basic usage

Call subrequest(url), it returns a response object.

>>> from plone.subrequest import subrequest
>>> response = subrequest('/folder1/@@url')
>>> response.getBody()
'http://nohost/folder1'

response.getBody() also works for code that calls response.write(data).

>>> response = subrequest('/@@response-write')
>>> response.getBody()
'Some data.\nSome more data.\n'

But in this case response.getBody() may only be called once.

>>> response.getBody()
Traceback (most recent call last):
    ...
ValueError: I/O operation on closed file

Accessing the response body as a file

Some code may call response.write(data).

>>> response = subrequest('/@@response-write')

In which case you may access response.stdout as file.

>>> response.stdout.seek(0, 0)
>>> list(response.stdout)
['Some data.\n', 'Some more data.\n']

You can test whether a file was returned using response._wrote.

>>> response._wrote
1

When you’re done, close the file:

>>> response.stdout.close()

Use response.outputBody() to ensure the body may be accessed as a file.

>>> from plone.subrequest import subrequest
>>> response = subrequest('/folder1/@@url')
>>> response._wrote
>>> response.outputBody()
>>> response._wrote
1
>>> response.stdout.seek(0, 0)
>>> list(response.stdout)
['http://nohost/folder1']

Relative paths

Relative paths are resolved relative to the parent request’s location:

>>> request = traverse('/folder1/@@test')
>>> response = subrequest('folder1A/@@url')
>>> response.getBody()
'http://nohost/folder1/folder1A'

This takes account of default view’s url.

>>> request = traverse('/folder1')
>>> request['URL'] == 'http://nohost/folder1/@@test'
True
>>> response = subrequest('folder1A/@@url')
>>> response.getBody()
'http://nohost/folder1/folder1A'

Virtual hosting

When virtual hosting is used, absolute paths are traversed from the virtual host root.

>>> request = traverse('/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/')
>>> response = subrequest('/folder1A/@@url')
>>> response.getBody()
'http://example.org/folder1A'

Specifying the root

You may also set the root object explicitly

>>> app = layer['app']
>>> response = subrequest('/folder1A/@@url', root=app.folder1)
>>> response.getBody()
'http://nohost/folder1/folder1A'

Error responses

Subrequests may not be found.

>>> response = subrequest('/not-found')
>>> response.status
404

Or might raise an error.

>>> response = subrequest('/@@error')
>>> response.status
500

So check for the expected status.

>>> response = subrequest('/')
>>> response.status == 200
True

Handling subrequests

The parent request is set as PARENT_REQUEST onto subrequests.

Subrequests also provide the plone.subrequest.interfaces.ISubRequest marker interface.

Changelog

1.6.6 (2012-06-29)

  • Log errors that occur handling a subrequest to help debug plone.app.theming errors including content from a different url [anthonygerrard]

1.6.5 (2012-04-15)

  • Ensure parent url is a string and not unicode. [davisagli]

1.6.4 - 2012-03-22

  • Fix problems with double encoding some unicode charse by not copying too many other variables. [elro]

1.6.3 - 2012-02-12

  • Copy other request variables such as LANGUAGE to subrequest. [elro]

1.6.2 - 2011-07-04

1.6.1 - 2011-07-04

  • Move tests to package directory to making testing possible when installed normally.

1.6 - 2011-06-06

  • Ensure url is a string and not unicode. [elro]

1.6b2 - 2011-05-20

  • Set PARENT_REQUEST and add ISubRequest interface to subrequests. [elro]

1.6b1 - 2011-02-11

  • Handle IStreamIterator. [elro]

  • Simplify API so response.getBody() always works. [elro]

1.5 - 2010-11-26

  • Merge cookies from subrequest response into parent response. [awello]

1.4 - 2010-11-10

  • First processInput, then traverse (fixes #11254) [awello]

1.3 - 2010-08-24

  • Fixed bug with virtual hosting and quoted paths. [elro]

1.2 - 2010-08-16

  • Restore zope.component site after subrequest. [elro]

1.1 - 2010-08-14

  • Virtual hosting, relative url and error response support. [elro]

1.0 - 2010-07-28

  • Initial release. [elro]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plone.subrequest-1.6.6.zip (27.0 kB view details)

Uploaded Source

File details

Details for the file plone.subrequest-1.6.6.zip.

File metadata

  • Download URL: plone.subrequest-1.6.6.zip
  • Upload date:
  • Size: 27.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for plone.subrequest-1.6.6.zip
Algorithm Hash digest
SHA256 9f8f361b60dd6c0d2923556e73b8caf637212f4171362621dffde6c728100af3
MD5 af5e20368ac6913002cba0f1db3aae85
BLAKE2b-256 79bd023ea5110981ade40ea4001bd93923ca573ee57d5856d59033671c8a3f59

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page