[Zope-Checkins] SVN: Zope/branches/2.9/ Backport fix for 2288,
together with part of the 2.10 tests for z3 views
Martijn Pieters
mj at zopatista.com
Sun Mar 4 15:50:43 EST 2007
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), ) )
More information about the Zope-Checkins
mailing list