SVN: Zope/branches/2.13/ Backport changeset committed to trunk in r121131.

Malthe Borch <[email protected]>
Newsgroups gmane.comp.web.zope.cvs
Message-ID <20110326165923.B98FD941F2__8996.18078624389$1301158775$gmane$org@cvs.zope.org>
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()

_______________________________________________
Zope-Checkins maillist  -  [email protected]
https://mail.zope.org/mailman/listinfo/zope-checkins
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.