Log message for revision 72974: Backport fix for 2288, together with part of the 2.10 tests for z3 views
Changed: U Zope/branches/2.9/doc/CHANGES.txt U Zope/branches/2.9/lib/python/ZPublisher/BaseRequest.py U Zope/branches/2.9/lib/python/ZPublisher/HTTPRequest.py U Zope/branches/2.9/lib/python/ZPublisher/tests/testBaseRequest.py -=- Modified: Zope/branches/2.9/doc/CHANGES.txt =================================================================== --- Zope/branches/2.9/doc/CHANGES.txt 2007-03-04 18:59:23 UTC (rev 72973) +++ Zope/branches/2.9/doc/CHANGES.txt 2007-03-04 20:50:42 UTC (rev 72974) @@ -8,6 +8,9 @@ Bugs fixed + - Collector #2288: @ and + should not be quoted when forming + request URLs in BaseRequest and HTTPRequest + - Undeprectated 'zLOG' package, which is going to remain a backward-compatibility shim for the Python logger. Modified: Zope/branches/2.9/lib/python/ZPublisher/BaseRequest.py =================================================================== --- Zope/branches/2.9/lib/python/ZPublisher/BaseRequest.py 2007-03-04 18:59:23 UTC (rev 72973) +++ Zope/branches/2.9/lib/python/ZPublisher/BaseRequest.py 2007-03-04 20:50:42 UTC (rev 72974) @@ -14,7 +14,7 @@ $Id$ """ -from urllib import quote +from urllib import quote as urllib_quote import xmlrpc from zExceptions import Forbidden @@ -23,6 +23,10 @@ UNSPECIFIED_ROLES='' +def quote(text): + # quote url path segments, but leave + and @ intact + return urllib_quote(text, '/+@') + try: from ExtensionClass import Base class RequestContainer(Base): Modified: Zope/branches/2.9/lib/python/ZPublisher/HTTPRequest.py =================================================================== --- Zope/branches/2.9/lib/python/ZPublisher/HTTPRequest.py 2007-03-04 18:59:23 UTC (rev 72973) +++ Zope/branches/2.9/lib/python/ZPublisher/HTTPRequest.py 2007-03-04 20:50:42 UTC (rev 72974) @@ -15,10 +15,10 @@ import re, sys, os, time, random, codecs from types import StringType, UnicodeType -from BaseRequest import BaseRequest +from BaseRequest import BaseRequest, quote from HTTPResponse import HTTPResponse from cgi import FieldStorage, escape -from urllib import quote, unquote, splittype, splitport +from urllib import unquote, splittype, splitport from copy import deepcopy from Converters import get_converter from TaintedString import TaintedString Modified: Zope/branches/2.9/lib/python/ZPublisher/tests/testBaseRequest.py =================================================================== --- Zope/branches/2.9/lib/python/ZPublisher/tests/testBaseRequest.py 2007-03-04 18:59:23 UTC (rev 72973) +++ Zope/branches/2.9/lib/python/ZPublisher/tests/testBaseRequest.py 2007-03-04 20:50:42 UTC (rev 72974) @@ -248,6 +248,76 @@ self.assertRaises(NotFound, r.traverse, 'folder/simpleFrozenSet') +import zope.interface +import zope.component +import zope.testing.cleanup +import zope.app.traversing.namespace +from zope.publisher.browser import IBrowserRequest +from zope.publisher.browser import IDefaultBrowserLayer +from zope.app.traversing.interfaces import ITraversable + + +class IDummy(zope.interface.Interface): + """IDummy""" + +class DummyObjectZ3(DummyObjectBasic): + zope.interface.implements(IDummy) + def __init__(self, name): + self.name = name + +class DummyView(Implicit): + def __init__(self, content, request): + self.content = content + self.request = request + def __call__(self): + return 'view on %s' % (self.content.name) + +class TestBaseRequestZope3Views(TestCase): + + def setUp(self): + zope.testing.cleanup.cleanUp() + self.root = DummyObjectBasic() + folder = self.root._setObject('folder', DummyObjectZ3('folder')) + folder._setObject('obj', DummyObjectZ3('obj')) + gsm = zope.component.getGlobalSiteManager() + + # The request needs to implement the proper interface + zope.interface.classImplements(BaseRequest, IDefaultBrowserLayer) + + # Define our 'meth' view + gsm.registerAdapter(DummyView, (IDummy, IDefaultBrowserLayer), None, + 'meth') + + # Bind the 'view' namespace (for @@ traversal) + gsm.registerAdapter(zope.traversing.namespace.view, + (IDummy, IDefaultBrowserLayer), ITraversable, + 'view') + + def tearDown(self): + zope.testing.cleanup.cleanUp() + + def makeBaseRequest(self): + response = HTTPResponse() + environment = { + 'URL': '', + 'PARENTS': [self.root], + 'steps': [], + '_hacked_path': 0, + '_test_counter': 0, + 'response': response, + } + return BaseRequest(environment) + + def test_quoting(self): + """View markers should not be quoted""" + r = self.makeBaseRequest() + r.traverse('folder/obj/@@meth') + self.assertEqual(r['URL'], '/folder/obj/@@meth') + + r = self.makeBaseRequest() + r.traverse('folder/obj/++view++meth') + self.assertEqual(r['URL'], '/folder/obj/++view++meth') + def test_suite(): return TestSuite( ( makeSuite(TestBaseRequest), ) ) _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins