[Checkins] SVN: zope.publisher/trunk/src/zope/publisher/ Don't use 'self' as a marker when checking for keys in a dictionary.

Philipp von Weitershausen philikon at philikon.de
Wed Aug 1 20:36:07 EDT 2007


Log message for revision 78536:
  Don't use 'self' as a marker when checking for keys in a dictionary.
  This prevents the admittedly esoteric problem that when the request is a
  key of itself (e.g. as 'REQUEST'), request.get('REQUEST') will work.
  

Changed:
  U   zope.publisher/trunk/src/zope/publisher/base.py
  U   zope.publisher/trunk/src/zope/publisher/browser.py
  U   zope.publisher/trunk/src/zope/publisher/http.py
  U   zope.publisher/trunk/src/zope/publisher/tests/basetestiapplicationrequest.py
  U   zope.publisher/trunk/src/zope/publisher/tests/test_browserrequest.py
  U   zope.publisher/trunk/src/zope/publisher/tests/test_http.py

-=-
Modified: zope.publisher/trunk/src/zope/publisher/base.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/base.py	2007-08-01 22:58:51 UTC (rev 78535)
+++ zope.publisher/trunk/src/zope/publisher/base.py	2007-08-02 00:36:05 UTC (rev 78536)
@@ -339,10 +339,10 @@
 
     def get(self, key, default=None):
         'See Interface.Common.Mapping.IReadMapping'
+        result = self._environ.get(key, _marker)
+        if result is not _marker:
+            return result
 
-        result = self._environ.get(key, self)
-        if result is not self: return result
-
         return default
 
     def __contains__(self, key):

Modified: zope.publisher/trunk/src/zope/publisher/browser.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/browser.py	2007-08-01 22:58:51 UTC (rev 78535)
+++ zope.publisher/trunk/src/zope/publisher/browser.py	2007-08-02 00:36:05 UTC (rev 78536)
@@ -560,19 +560,13 @@
 
     def get(self, key, default=None):
         'See Interface.Common.Mapping.IReadMapping'
+        marker = object()
+        result = self.form.get(key, marker)
+        if result is not marker:
+            return result
 
-        result = self.form.get(key, self)
-        if result is not self: return result
+        return super(BrowserRequest, self).get(key, default)
 
-        result = self._cookies.get(key, self)
-        if result is not self: return result
-
-        result = self._environ.get(key, self)
-        if result is not self: return result
-
-        return default
-
-
 class ZopeFieldStorage(FieldStorage):
 
     def make_file(self, binary=None):

Modified: zope.publisher/trunk/src/zope/publisher/http.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/http.py	2007-08-01 22:58:51 UTC (rev 78535)
+++ zope.publisher/trunk/src/zope/publisher/http.py	2007-08-02 00:36:05 UTC (rev 78536)
@@ -586,15 +586,13 @@
 
     def get(self, key, default=None):
         'See Interface.Common.Mapping.IReadMapping'
+        marker = object()
+        result = self._cookies.get(key, marker)
+        if result is not marker:
+            return result
 
-        result = self._cookies.get(key, self)
-        if result is not self: return result
+        return super(HTTPRequest, self).get(key, default)
 
-        result = self._environ.get(key, self)
-        if result is not self: return result
-
-        return default
-
     def keys(self):
         'See Interface.Common.Mapping.IEnumerableMapping'
         d = {}

Modified: zope.publisher/trunk/src/zope/publisher/tests/basetestiapplicationrequest.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/tests/basetestiapplicationrequest.py	2007-08-01 22:58:51 UTC (rev 78535)
+++ zope.publisher/trunk/src/zope/publisher/tests/basetestiapplicationrequest.py	2007-08-02 00:36:05 UTC (rev 78536)
@@ -46,3 +46,13 @@
         testIReadMapping(self, environment,
                          {'foo': 'Foo', 'bar': 'Bar'},
                          ['splat'])
+
+    def testGetAndDefaultInMapping(self):
+        # This is a bit of a hack, but we have no other way to make
+        # the request an item of itself (which we want to test).
+        request = self._Test__new()
+        request._environ['REQUEST'] = request
+
+        # Now make sure that request.get can actually deal with return
+        # self back to us correctly:
+        self.assert_(request.get('REQUEST') is request)

Modified: zope.publisher/trunk/src/zope/publisher/tests/test_browserrequest.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/tests/test_browserrequest.py	2007-08-01 22:58:51 UTC (rev 78535)
+++ zope.publisher/trunk/src/zope/publisher/tests/test_browserrequest.py	2007-08-02 00:36:05 UTC (rev 78536)
@@ -17,10 +17,12 @@
 """
 import sys
 import unittest
+from StringIO import StringIO
 
 from zope.interface import implements, directlyProvides, Interface
 from zope.interface.verify import verifyObject
 
+from zope.publisher.publish import publish as publish_
 from zope.publisher.http import HTTPCharsets
 from zope.publisher.browser import BrowserRequest
 from zope.publisher.interfaces import NotFound
@@ -28,12 +30,17 @@
 from zope.publisher.base import DefaultPublication
 from zope.publisher.interfaces.browser import IBrowserApplicationRequest
 from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.publisher.interfaces.browser import IBrowserPublication
 
-from StringIO import StringIO
-
 from zope.publisher.tests.test_http import HTTPTests
+from zope.publisher.tests.publication import TestPublication
 
-from zope.publisher.publish import publish as publish_
+from zope.publisher.tests.basetestipublicationrequest \
+     import BaseTestIPublicationRequest
+from zope.publisher.tests.basetestipublisherrequest \
+     import BaseTestIPublisherRequest
+from zope.publisher.tests.basetestiapplicationrequest \
+     import BaseTestIApplicationRequest
 
 LARGE_FILE_BODY = """-----------------------------1
 Content-Disposition: form-data; name="upload"; filename="test"
@@ -473,9 +480,66 @@
         self.assertEqual(request.form, {u'HTTP_REFERER': u'peter'})
 
 
+class TestBrowserPublication(TestPublication):
+    implements(IBrowserPublication)
+
+    def getDefaultTraversal(self, request, ob):
+        return ob, ()
+
+class APITests(BaseTestIPublicationRequest,
+               BaseTestIApplicationRequest,
+               BaseTestIPublisherRequest,
+               unittest.TestCase):
+
+    def _Test__new(self, environ=None, **kw):
+        if environ is None:
+            environ = kw
+        return BrowserRequest(StringIO(''), environ)
+
+    def test_IApplicationRequest_bodyStream(self):
+        request = BrowserRequest(StringIO('spam'), {})
+        self.assertEqual(request.bodyStream.read(), 'spam')
+
+    # Needed by BaseTestIEnumerableMapping tests:
+    def _IEnumerableMapping__stateDict(self):
+        return {'id': 'ZopeOrg', 'title': 'Zope Community Web Site',
+                'greet': 'Welcome to the Zope Community Web site'}
+
+    def _IEnumerableMapping__sample(self):
+        return self._Test__new(**(self._IEnumerableMapping__stateDict()))
+
+    def _IEnumerableMapping__absentKeys(self):
+        return 'foo', 'bar'
+
+    def test_IPublicationRequest_getPositionalArguments(self):
+        self.assertEqual(self._Test__new().getPositionalArguments(), ())
+
+    def test_IPublisherRequest_retry(self):
+        self.assertEqual(self._Test__new().supportsRetry(), True)
+
+    def test_IPublisherRequest_processInputs(self):
+        self._Test__new().processInputs()
+
+    def test_IPublisherRequest_traverse(self):
+        request = self._Test__new()
+        request.setPublication(TestBrowserPublication())
+        app = request.publication.getApplication(request)
+
+        request.setTraversalStack([])
+        self.assertEqual(request.traverse(app).name, '')
+        self.assertEqual(request._last_obj_traversed, app)
+        request.setTraversalStack(['ZopeCorp'])
+        self.assertEqual(request.traverse(app).name, 'ZopeCorp')
+        self.assertEqual(request._last_obj_traversed, app.ZopeCorp)
+        request.setTraversalStack(['Engineering', 'ZopeCorp'])
+        self.assertEqual(request.traverse(app).name, 'Engineering')
+        self.assertEqual(request._last_obj_traversed, app.ZopeCorp.Engineering)
+
 def test_suite():
-    loader = unittest.TestLoader()
-    return loader.loadTestsFromTestCase(BrowserTests)
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(BrowserTests))
+    suite.addTest(unittest.makeSuite(APITests))
+    return suite
 
 
 if __name__ == '__main__':

Modified: zope.publisher/trunk/src/zope/publisher/tests/test_http.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/tests/test_http.py	2007-08-01 22:58:51 UTC (rev 78535)
+++ zope.publisher/trunk/src/zope/publisher/tests/test_http.py	2007-08-02 00:36:05 UTC (rev 78536)
@@ -19,10 +19,15 @@
 import sys
 import tempfile
 import unittest
+from StringIO import StringIO
+from Cookie import CookieError
+
+import zope.event
+import zope.testing.cleanup
 from zope.testing import doctest
-import zope.testing.cleanup
+from zope.i18n.interfaces.locales import ILocale
+from zope.interface.verify import verifyObject
 
-import zope.event
 from zope.interface import implements
 from zope.publisher.interfaces.logginginfo import ILoggingInfo
 from zope.publisher.http import HTTPRequest, HTTPResponse
@@ -32,15 +37,17 @@
 from zope.publisher.interfaces.http import IHTTPRequest, IHTTPResponse
 from zope.publisher.interfaces.http import IHTTPApplicationResponse
 from zope.publisher.interfaces import IResponse
+from zope.publisher.tests.publication import TestPublication
 
-from zope.i18n.interfaces.locales import ILocale
+from zope.publisher.tests.basetestipublicationrequest \
+     import BaseTestIPublicationRequest
+from zope.publisher.tests.basetestipublisherrequest \
+     import BaseTestIPublisherRequest
+from zope.publisher.tests.basetestiapplicationrequest \
+     import BaseTestIApplicationRequest
 
-from zope.interface.verify import verifyObject
 
-from StringIO import StringIO
-from Cookie import CookieError
 
-
 class UserStub(object):
     implements(ILoggingInfo)
 
@@ -706,6 +713,56 @@
             )
 
 
+class APITests(BaseTestIPublicationRequest,
+               BaseTestIApplicationRequest,
+               BaseTestIPublisherRequest,
+               unittest.TestCase):
+
+    def _Test__new(self, environ=None, **kw):
+        if environ is None:
+            environ = kw
+        return HTTPRequest(StringIO(''), environ)
+
+    def test_IApplicationRequest_bodyStream(self):
+        request = HTTPRequest(StringIO('spam'), {})
+        self.assertEqual(request.bodyStream.read(), 'spam')
+
+    # Needed by BaseTestIEnumerableMapping tests:
+    def _IEnumerableMapping__stateDict(self):
+        return {'id': 'ZopeOrg', 'title': 'Zope Community Web Site',
+                'greet': 'Welcome to the Zope Community Web site'}
+
+    def _IEnumerableMapping__sample(self):
+        return self._Test__new(**(self._IEnumerableMapping__stateDict()))
+
+    def _IEnumerableMapping__absentKeys(self):
+        return 'foo', 'bar'
+
+    def test_IPublicationRequest_getPositionalArguments(self):
+        self.assertEqual(self._Test__new().getPositionalArguments(), ())
+
+    def test_IPublisherRequest_retry(self):
+        self.assertEqual(self._Test__new().supportsRetry(), True)
+
+    def test_IPublisherRequest_processInputs(self):
+        self._Test__new().processInputs()
+
+    def test_IPublisherRequest_traverse(self):
+        request = self._Test__new()
+        request.setPublication(TestPublication())
+        app = request.publication.getApplication(request)
+
+        request.setTraversalStack([])
+        self.assertEqual(request.traverse(app).name, '')
+        self.assertEqual(request._last_obj_traversed, app)
+        request.setTraversalStack(['ZopeCorp'])
+        self.assertEqual(request.traverse(app).name, 'ZopeCorp')
+        self.assertEqual(request._last_obj_traversed, app.ZopeCorp)
+        request.setTraversalStack(['Engineering', 'ZopeCorp'])
+        self.assertEqual(request.traverse(app).name, 'Engineering')
+        self.assertEqual(request._last_obj_traversed, app.ZopeCorp.Engineering)
+
+
 def cleanUp(test):
     zope.testing.cleanup.cleanUp()
 
@@ -717,6 +774,7 @@
     suite.addTest(unittest.makeSuite(HTTPInputStreamTests))
     suite.addTest(doctest.DocFileSuite(
         '../httpresults.txt', setUp=cleanUp, tearDown=cleanUp))
+    suite.addTest(unittest.makeSuite(APITests))
     return suite
 
 



More information about the Checkins mailing list