From 9430742ba6a9e8f5023ecec8b4b47ed8f388bb6d Mon Sep 17 00:00:00 2001 From: Stefaan Ghysels Date: Wed, 21 Dec 2016 20:48:07 +0100 Subject: [PATCH] add support for eventlets _AlreadyHandled object (#1406) add support for eventlets _AlreadyHandled - issue 1210 - Response object has no attribute status_code --- gunicorn/workers/async.py | 6 +++++- gunicorn/workers/geventlet.py | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gunicorn/workers/async.py b/gunicorn/workers/async.py index 53da7cac..a3a0f912 100644 --- a/gunicorn/workers/async.py +++ b/gunicorn/workers/async.py @@ -27,6 +27,10 @@ class AsyncWorker(base.Worker): def timeout_ctx(self): raise NotImplementedError() + def is_already_handled(self, respiter): + # some workers will need to overload this function to raise a StopIteration + return respiter == ALREADY_HANDLED + def handle(self, listener, client, addr): req = None try: @@ -101,7 +105,7 @@ class AsyncWorker(base.Worker): resp.force_close() respiter = self.wsgi(environ, resp.start_response) - if respiter == ALREADY_HANDLED: + if self.is_already_handled(respiter): return False try: if isinstance(respiter, environ['wsgi.file_wrapper']): diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index f772b75d..ec1bf135 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -20,6 +20,7 @@ if eventlet.version_info < (0, 9, 7): from eventlet import hubs, greenthread from eventlet.greenio import GreenSocket from eventlet.hubs import trampoline +from eventlet.wsgi import ALREADY_HANDLED as EVENTLET_ALREADY_HANDLED import greenlet from gunicorn.http.wsgi import sendfile as o_sendfile @@ -91,6 +92,12 @@ class EventletWorker(AsyncWorker): eventlet.monkey_patch(os=False) patch_sendfile() + def is_already_handled(self, respiter): + if respiter == EVENTLET_ALREADY_HANDLED: + raise StopIteration() + else: + return super(EventletWorker, self).is_already_handled(respiter) + def init_process(self): self.patch() super(EventletWorker, self).init_process()