[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