[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