[Zope-Checkins] SVN: Zope/branches/2.13/ Backport changeset committed to trunk in r121131.

Malthe Borch mborch at gmail.com
Sat Mar 26 12:59:23 EDT 2011


Log message for revision 121132:
  Backport changeset committed to trunk in r121131.

Changed:
  U   Zope/branches/2.13/doc/CHANGES.rst
  U   Zope/branches/2.13/src/ZPublisher/WSGIPublisher.py
  U   Zope/branches/2.13/src/ZPublisher/tests/test_WSGIPublisher.py

-=-
Modified: Zope/branches/2.13/doc/CHANGES.rst
===================================================================
--- Zope/branches/2.13/doc/CHANGES.rst	2011-03-26 16:53:52 UTC (rev 121131)
+++ Zope/branches/2.13/doc/CHANGES.rst	2011-03-26 16:59:23 UTC (rev 121132)
@@ -11,6 +11,10 @@
 Bugs Fixed
 ++++++++++
 
+- Fix `WSGIResponse` and `publish_module` functions such that they
+  support the `IStreamIterator` interface in addition to `file` (as
+  supported by `ZServer.HTTPResponse`).
+
 - Corrected copyright information shown in the ZMI.
 
 - OFS: Fixed editing offset-naive 'date' properties in the ZMI.

Modified: Zope/branches/2.13/src/ZPublisher/WSGIPublisher.py
===================================================================
--- Zope/branches/2.13/src/ZPublisher/WSGIPublisher.py	2011-03-26 16:53:52 UTC (rev 121131)
+++ Zope/branches/2.13/src/ZPublisher/WSGIPublisher.py	2011-03-26 16:59:23 UTC (rev 121132)
@@ -30,6 +30,7 @@
 from ZPublisher.Publish import dont_publish_class
 from ZPublisher.Publish import get_module_info
 from ZPublisher.Publish import missing_name
+from ZPublisher.Iterators import IStreamIterator
 
 _NOW = None     # overwrite for testing
 def _now():
@@ -125,7 +126,7 @@
         self.stdout.write(data)
 
     def setBody(self, body, title='', is_error=0):
-        if isinstance(body, file):
+        if isinstance(body, file) or IStreamIterator.providedBy(body):
             body.seek(0, 2)
             length = body.tell()
             body.seek(0)
@@ -226,8 +227,10 @@
     status, headers = response.finalize()
     start_response(status, headers)
 
-    if isinstance(response.body, file):
-        result = response.body
+    body = response.body
+
+    if isinstance(body, file) or IStreamIterator.providedBy(body):
+        result = body
     else:
         # If somebody used response.write, that data will be in the
         # stdout StringIO, so we put that before the body.

Modified: Zope/branches/2.13/src/ZPublisher/tests/test_WSGIPublisher.py
===================================================================
--- Zope/branches/2.13/src/ZPublisher/tests/test_WSGIPublisher.py	2011-03-26 16:53:52 UTC (rev 121131)
+++ Zope/branches/2.13/src/ZPublisher/tests/test_WSGIPublisher.py	2011-03-26 16:59:23 UTC (rev 121132)
@@ -370,6 +370,32 @@
         app_iter = self._callFUT(environ, start_response, _publish)
         self.assertTrue(app_iter is body)
 
+    def test_response_is_stream(self):
+        from ZPublisher.Iterators import IStreamIterator
+        from zope.interface import implements
+
+        class test_streamiterator:
+            implements(IStreamIterator)
+            data = "hello"
+            done = 0
+
+            def next(self):
+                if not self.done:
+                    self.done = 1
+                    return self.data
+                raise StopIteration
+
+        _response = DummyResponse()
+        _response._status = '200 OK'
+        _response._headers = [('Content-Length', '4')]
+        body = _response.body = test_streamiterator()
+        environ = self._makeEnviron()
+        start_response = DummyCallable()
+        _publish = DummyCallable()
+        _publish._result = _response
+        app_iter = self._callFUT(environ, start_response, _publish)
+        self.assertTrue(app_iter is body)
+
     def test_request_closed_when_tm_middleware_not_active(self):
         environ = self._makeEnviron()
         start_response = DummyCallable()



More information about the Zope-Checkins mailing list