-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1
On 03/26/2011 12:53 PM, Malthe Borch wrote:
Log message for revision 121131:
Adding support for ``IStreamIterator`` to WSGI publishing machinery.
Changed:
U Zope/trunk/doc/CHANGES.rst
U Zope/trunk/src/ZPublisher/WSGIPublisher.py
U Zope/trunk/src/ZPublisher/tests/test_WSGIPublisher.py
-=-
Modified: Zope/trunk/doc/CHANGES.rst
===
--- Zope/trunk/doc/CHANGES.rst2011-03-25 17:39:14 UTC (rev 121130)
+++ Zope/trunk/doc/CHANGES.rst2011-03-26 16:53:52 UTC (rev 121131)
@@ -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`).
+
- Made sure getConfiguration().default_zpublisher_encoding is set correctly.
- LP #713253: Prevent publication of acquired attributes, where the acquired
Modified: Zope/trunk/src/ZPublisher/WSGIPublisher.py
===
--- Zope/trunk/src/ZPublisher/WSGIPublisher.py2011-03-25 17:39:14 UTC
(rev 121130)
+++ Zope/trunk/src/ZPublisher/WSGIPublisher.py2011-03-26 16:53:52 UTC
(rev 121131)
@@ -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)
This part of the patch can't possibly work in the general case: nothing
in IStreamIterator promises that 'seek' and 'tell' are available.
@@ -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/trunk/src/ZPublisher/tests/test_WSGIPublisher.py
===
--- Zope/trunk/src/ZPublisher/tests/test_WSGIPublisher.py 2011-03-25
17:39:14 UTC (rev 121130)
+++ Zope/trunk/src/ZPublisher/tests/test_WSGIPublisher.py 2011-03-26
16:53:52 UTC (rev 121131)
@@ -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)
+
This test doesn't exercise the length checking branch (it would raise
AttributeError otherwise).
Tres.
- --
===
Tres Seaver +1 540-429-0999 tsea...@palladion.com
Palladion Software Excellence by Designhttp://palladion.com
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAk2OHwkACgkQ+gerLs4ltQ4O7wCgyazebfa92fAERR7fYs8jaR8w
Q3kAn2eZg5aqdeHAa8hMMppPTmCURYNF
=gieo
-END PGP SIGNATURE-
___
Zope-Dev maillist - Zope-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
https://mail.zope.org/mailman/listinfo/zope-announce
https://mail.zope.org/mailman/listinfo/zope )