[Checkins] SVN: zope.publisher/branches/3.4/src/zope/publisher/ Fixed critical bug #98440 (interfaces lost on retried request)

Christophe Combelles ccomb at free.fr
Tue Aug 12 20:08:42 EDT 2008


Log message for revision 89765:
  Fixed critical bug #98440 (interfaces lost on retried request)
  

Changed:
  U   zope.publisher/branches/3.4/src/zope/publisher/http.py
  U   zope.publisher/branches/3.4/src/zope/publisher/tests/test_baserequest.py

-=-
Modified: zope.publisher/branches/3.4/src/zope/publisher/http.py
===================================================================
--- zope.publisher/branches/3.4/src/zope/publisher/http.py	2008-08-13 00:02:36 UTC (rev 89764)
+++ zope.publisher/branches/3.4/src/zope/publisher/http.py	2008-08-13 00:08:41 UTC (rev 89765)
@@ -436,13 +436,15 @@
         count = getattr(self, '_retry_count', 0)
         self._retry_count = count + 1
 
-        new_response = self.response.retry()
         request = self.__class__(
             # Use the cache stream as the new input stream.
             body_instream=self._body_instream.getCacheStream(),
             environ=self._orig_env,
-            response=new_response,
+            response=self.response.retry(),
             )
+        # restore the interfaces
+        interface.alsoProvides(request, interface.providedBy(self))
+
         request.setPublication(self.publication)
         request._retry_count = self._retry_count
         return request

Modified: zope.publisher/branches/3.4/src/zope/publisher/tests/test_baserequest.py
===================================================================
--- zope.publisher/branches/3.4/src/zope/publisher/tests/test_baserequest.py	2008-08-13 00:02:36 UTC (rev 89764)
+++ zope.publisher/branches/3.4/src/zope/publisher/tests/test_baserequest.py	2008-08-13 00:08:41 UTC (rev 89765)
@@ -27,6 +27,7 @@
      import BaseTestIApplicationRequest
 
 from StringIO import StringIO
+from zope.interface import Interface, providedBy, alsoProvides
 
 class TestBaseRequest(BaseTestIPublicationRequest,
                       BaseTestIApplicationRequest,
@@ -88,7 +89,32 @@
     def test_SetRequestInResponse(self):
         request = self._Test__new()
         self.assertEqual(request.response._request, request)
-        
+
+    def test_retry_keeps_everything(self):
+        """lowlevel test for retry (see #98440)"""
+        # create a retryable request
+        from zope.publisher.browser import TestRequest
+        request = TestRequest()
+        self.assertTrue(request.supportsRetry())
+        # add an interface (this can be a layer)
+        class ISomeInterface(Interface):
+            pass
+        alsoProvides(request, ISomeInterface)
+        # create a retried request
+        retried = request.retry()
+
+        # the requests are not the same
+        self.assertTrue(request is not retried)
+        # the requests have the same attribute list
+        self.assertEqual(dir(request), dir(retried))
+        # the requests have the same interfaces
+        request_interfaces = sorted(list(providedBy(request)))
+        retried_interfaces = sorted(list(providedBy(retried)))
+        self.assertTrue(ISomeInterface.providedBy(retried))
+
+        self.assertEqual(request_interfaces, retried_interfaces)
+
+
 def test_suite():
     return makeSuite(TestBaseRequest)
 



More information about the Checkins mailing list