From 38b96d167dbf4c78ab95dacfb5c0bc2dee9f8692 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Mon, 21 Jun 2010 17:22:32 -0700 Subject: [PATCH] Upgrading wsgi to also ignore tpooled AlreadyHandled results (because isinstance delibarately doesn't work on Proxy objects). --- eventlet/wsgi.py | 3 ++- tests/wsgi_test.py | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index 4b6a93d..36ceee7 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -333,7 +333,8 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): try: try: result = self.application(self.environ, start_response) - if isinstance(result, _AlreadyHandled): + if (isinstance(result, _AlreadyHandled) + or isinstance(getattr(result, '_obj', None), _AlreadyHandled)): self.close_connection = 1 return if not headers_sent and hasattr(result, '__len__') and \ diff --git a/tests/wsgi_test.py b/tests/wsgi_test.py index e9281ec..8de1bf5 100644 --- a/tests/wsgi_test.py +++ b/tests/wsgi_test.py @@ -93,13 +93,13 @@ class IterableApp(object): return self.return_val class IterableSite(Site): - def __call__(self, env, start_response): - iter = self.application(env, start_response) - for i in iter: + it = self.application(env, start_response) + for i in it: yield i + CONTENT_LENGTH = 'content-length' @@ -899,12 +899,14 @@ def read_headers(sock): return response_line, headers class IterableAlreadyHandledTest(_TestBase): - def set_site(self): self.site = IterableSite() + def get_app(self): + return IterableApp(True) + def test_iterable_app_keeps_socket_open_unless_connection_close_sent(self): - self.site.application = IterableApp(True) + self.site.application = self.get_app() sock = eventlet.connect( ('localhost', self.port)) @@ -922,6 +924,13 @@ class IterableAlreadyHandledTest(_TestBase): self.assertEqual(headers.get('transfer-encoding'), 'chunked') self.assertEqual(body, '0\r\n\r\n') # Still coming back chunked +class ProxiedIterableAlreadyHandledTest(IterableAlreadyHandledTest): + # same thing as the previous test but ensuring that it works with tpooled + # results as well as regular ones + def get_app(self): + from eventlet import tpool + return tpool.Proxy(super(ProxiedIterableAlreadyHandledTest, self).get_app()) + class TestChunkedInput(_TestBase): dirt = "" validator = None