add support for eventlets _AlreadyHandled object (#1406)

add support for eventlets _AlreadyHandled - issue 1210 - Response object has no attribute status_code
This commit is contained in:
Stefaan Ghysels 2016-12-21 20:48:07 +01:00 committed by Benoit Chesneau
parent cc4620fb5b
commit 9430742ba6
2 changed files with 12 additions and 1 deletions

View File

@ -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']):

View File

@ -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()