-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Products.MimetypesRegistry used in p.a.blob.utils but no dependency #19
Comments
jensens
added a commit
to plone/plone.subrequest
that referenced
this issue
Mar 5, 2015
…in upstream package, see plone/plone.app.blob#19 for details.
look at plone/plone.subrequest@f929049 for such a workaround |
jensens
added a commit
to plone/buildout.coredev
that referenced
this issue
Mar 5, 2015
Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/161041e7b0b5aa2403d22ea7fff63fb3fd1639a4 Fix issue where new cookies from the main request.response are not passed to subrequests. Files changed: M plone/subrequest/__init__.py M plone/subrequest/tests.py diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..4fe947d 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -95,6 +95,8 @@ def subrequest(url, root=None, stdout=None): if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..c5f9d8b 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -152,6 +152,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9ca8b8e99cd4c52dbec8f2fd0bfa161729cdf8ef Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index ee2204c..e45e81c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,13 @@ Changelog ========= +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + 1.6.8 (unreleased) ------------------ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9161b1d804a3933f0a18d38b9ebe469ec1d4a386 Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index e45e81c..29d8f74 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,9 +8,6 @@ Changelog subrequests. [datakurre] -1.6.8 (unreleased) ------------------- - - Handle sub-requests which contain a doubled // in the path. [gweis] Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/1263a402e411789f296adbd17758af4a719f4e8a Fix the next version in changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index 29d8f74..9db44b7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,7 @@ Changelog ========= -1.6.9 (unreleased) +1.6.8 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:31:13+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/9fe6bd48f1efca3bbb7d1d5610a0d3b4b0a2e422 fix version confusion Files changed: M CHANGES.txt M setup.py diff --git a/CHANGES.txt b/CHANGES.txt index 9db44b7..7f9ebcb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,13 +1,15 @@ Changelog ========= -1.6.8 (unreleased) +1.6.9 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] +1.6.8 (2014-03-04) +------------------ - Handle sub-requests which contain a doubled // in the path. [gweis] diff --git a/setup.py b/setup.py index eee1369..c98e240 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( name = 'plone.subrequest', Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:32:12+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/bd485843b90f4a3a21c976691be2ea366f4f6559 housekeeping: txt->rst Files changed: A CHANGES.rst A README.rst M setup.py D CHANGES.txt D README.txt diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..7f9ebcb --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,114 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +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 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +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] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index 7f9ebcb..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,114 +0,0 @@ -Changelog -========= - -1.6.9 (unreleased) ------------------- - -- Fix issue where new cookies from the main request.response are not passed to - subrequests. - [datakurre] - -1.6.8 (2014-03-04) ------------------- -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -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 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -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] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +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. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -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. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/setup.py b/setup.py index c98e240..a0ce162 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,9 @@ name = 'plone.subrequest', version = version, description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:55:59+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/034cd27880cbd705bd54a3534e14d9d6ca26434b housekeeping Files changed: M .gitignore diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T18:14:49+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/8013724732e784dfa59431b1019e3698e7ce496c pep8 et al Files changed: M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index 4fe947d..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,7 +97,9 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value for key, value in parent_request.response.cookies.items(): @@ -106,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -140,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index c5f9d8b..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -204,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index a0ce162..1a06ff4 100644 --- a/setup.py +++ b/setup.py @@ -4,9 +4,9 @@ version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + open("CHANGES.rst").read(), Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:03:55+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/f92904947f358fd12f095b0eb0ca5d27b187afc8 Workaround for broken test because of missing dependency declaration in upstream package, see https://github.com/plone/plone.app.blob/issues/19 for details. Files changed: M CHANGES.rst M setup.py diff --git a/CHANGES.rst b/CHANGES.rst index 7f9ebcb..69fe80a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,14 @@ Changelog 1.6.9 (unreleased) ------------------ +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] diff --git a/setup.py b/setup.py index 1a06ff4..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points=""" Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:21:06+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/0f52a877f0be19fa585d65496db35d4088bbc76c Merge pull request #2 from plone/mosaicsprint Fix issue where new cookies from the main request.response are not passed to subrequests Files changed: A CHANGES.rst A README.rst M .gitignore M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py D CHANGES.txt D README.txt diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..69fe80a --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,122 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +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 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +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] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index ee2204c..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,108 +0,0 @@ -Changelog -========= - -1.6.8 (unreleased) ------------------- - -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -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 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -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] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +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. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -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. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,9 +97,13 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: @@ -104,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -138,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -152,6 +213,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) @@ -198,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index eee1369..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,15 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points="""
jensens
added a commit
to plone/buildout.coredev
that referenced
this issue
Mar 5, 2015
Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/161041e7b0b5aa2403d22ea7fff63fb3fd1639a4 Fix issue where new cookies from the main request.response are not passed to subrequests. Files changed: M plone/subrequest/__init__.py M plone/subrequest/tests.py diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..4fe947d 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -95,6 +95,8 @@ def subrequest(url, root=None, stdout=None): if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..c5f9d8b 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -152,6 +152,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9ca8b8e99cd4c52dbec8f2fd0bfa161729cdf8ef Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index ee2204c..e45e81c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,13 @@ Changelog ========= +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + 1.6.8 (unreleased) ------------------ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9161b1d804a3933f0a18d38b9ebe469ec1d4a386 Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index e45e81c..29d8f74 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,9 +8,6 @@ Changelog subrequests. [datakurre] -1.6.8 (unreleased) ------------------- - - Handle sub-requests which contain a doubled // in the path. [gweis] Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/1263a402e411789f296adbd17758af4a719f4e8a Fix the next version in changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index 29d8f74..9db44b7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,7 @@ Changelog ========= -1.6.9 (unreleased) +1.6.8 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:31:13+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/9fe6bd48f1efca3bbb7d1d5610a0d3b4b0a2e422 fix version confusion Files changed: M CHANGES.txt M setup.py diff --git a/CHANGES.txt b/CHANGES.txt index 9db44b7..7f9ebcb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,13 +1,15 @@ Changelog ========= -1.6.8 (unreleased) +1.6.9 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] +1.6.8 (2014-03-04) +------------------ - Handle sub-requests which contain a doubled // in the path. [gweis] diff --git a/setup.py b/setup.py index eee1369..c98e240 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( name = 'plone.subrequest', Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:32:12+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/bd485843b90f4a3a21c976691be2ea366f4f6559 housekeeping: txt->rst Files changed: A CHANGES.rst A README.rst M setup.py D CHANGES.txt D README.txt diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..7f9ebcb --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,114 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +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 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +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] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index 7f9ebcb..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,114 +0,0 @@ -Changelog -========= - -1.6.9 (unreleased) ------------------- - -- Fix issue where new cookies from the main request.response are not passed to - subrequests. - [datakurre] - -1.6.8 (2014-03-04) ------------------- -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -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 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -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] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +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. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -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. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/setup.py b/setup.py index c98e240..a0ce162 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,9 @@ name = 'plone.subrequest', version = version, description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:55:59+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/034cd27880cbd705bd54a3534e14d9d6ca26434b housekeeping Files changed: M .gitignore diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T18:14:49+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/8013724732e784dfa59431b1019e3698e7ce496c pep8 et al Files changed: M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index 4fe947d..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,7 +97,9 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value for key, value in parent_request.response.cookies.items(): @@ -106,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -140,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index c5f9d8b..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -204,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index a0ce162..1a06ff4 100644 --- a/setup.py +++ b/setup.py @@ -4,9 +4,9 @@ version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + open("CHANGES.rst").read(), Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:03:55+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/f92904947f358fd12f095b0eb0ca5d27b187afc8 Workaround for broken test because of missing dependency declaration in upstream package, see https://github.com/plone/plone.app.blob/issues/19 for details. Files changed: M CHANGES.rst M setup.py diff --git a/CHANGES.rst b/CHANGES.rst index 7f9ebcb..69fe80a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,14 @@ Changelog 1.6.9 (unreleased) ------------------ +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] diff --git a/setup.py b/setup.py index 1a06ff4..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points=""" Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:21:06+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/0f52a877f0be19fa585d65496db35d4088bbc76c Merge pull request #2 from plone/mosaicsprint Fix issue where new cookies from the main request.response are not passed to subrequests Files changed: A CHANGES.rst A README.rst M .gitignore M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py D CHANGES.txt D README.txt diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..69fe80a --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,122 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +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 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +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] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index ee2204c..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,108 +0,0 @@ -Changelog -========= - -1.6.8 (unreleased) ------------------- - -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -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 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -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] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +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. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -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. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,9 +97,13 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: @@ -104,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -138,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -152,6 +213,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) @@ -198,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index eee1369..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,15 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points="""
@jensens Why don't we just declare this dependency in plone.app.blob setup.py? |
thats the plan, will do, and as soon theres a new release i remove it from plone.subrequest. but i want to have it working now and tests green. |
davisagli
added a commit
that referenced
this issue
Mar 7, 2015
Fix #19: Fix: Products.MimetypesRegistry used in p.a.blob.utils but no dependency
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Products.MimetypesRegistry is imported in
utils.py
, but there is no dependency in setup.py.This breaks tests in other modules (i.e. plone.subrequest) depending on this package and expecting correctly given dependencies.
The text was updated successfully, but these errors were encountered: