mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
Fix async req/resp handlers.
This commit is contained in:
parent
2242be27cf
commit
e4b7263314
@ -31,10 +31,16 @@ class KeepaliveResponse(http.Response):
|
||||
"Connection: %s\r\n" % connection_hdr
|
||||
]
|
||||
|
||||
def close(self):
|
||||
if self.chunked:
|
||||
write_chunk(self.socket, "")
|
||||
|
||||
class KeepaliveRequest(http.Request):
|
||||
|
||||
RESPONSE_CLASS = KeepaliveResponse
|
||||
|
||||
def read(self):
|
||||
ret = select.select([self._sock], [], [], self.conf.keepalive)
|
||||
ret = select.select([self.socket], [], [], self.conf.keepalive)
|
||||
if not ret[0]:
|
||||
return
|
||||
try:
|
||||
@ -63,8 +69,15 @@ class KeepaliveWorker(Worker):
|
||||
environ = req.read()
|
||||
if not environ or not req.parser.headers:
|
||||
return
|
||||
response = self.app(environ, req.start_response)
|
||||
if response == ALREADY_HANDLED:
|
||||
respiter = self.app(environ, req.start_response)
|
||||
if respiter == ALREADY_HANDLED:
|
||||
break
|
||||
for item in respiter:
|
||||
req.response.write(item)
|
||||
req.response.close()
|
||||
if hasattr(respiter, "close"):
|
||||
respiter.close()
|
||||
if req.parser.should_close:
|
||||
break
|
||||
except Exception, e:
|
||||
#Only send back traceback in HTTP in debug mode.
|
||||
@ -73,9 +86,6 @@ class KeepaliveWorker(Worker):
|
||||
util.write_error(client, traceback.format_exc())
|
||||
break
|
||||
|
||||
KeepaliveResponse(client, response, req).send()
|
||||
if req.parser.should_close:
|
||||
break
|
||||
except socket.error, e:
|
||||
if e[0] != errno.EPIPE:
|
||||
self.log.exception("Error processing request.")
|
||||
|
||||
@ -26,7 +26,8 @@ class RequestError(Exception):
|
||||
pass
|
||||
|
||||
class Request(object):
|
||||
|
||||
|
||||
RESPONSE_CLASS = Response
|
||||
SERVER_VERSION = "gunicorn/%s" % __version__
|
||||
|
||||
DEFAULTS = {
|
||||
@ -165,5 +166,5 @@ class Request(object):
|
||||
elif self.response is not None:
|
||||
raise AssertionError("Response headers already set!")
|
||||
|
||||
self.response = Response(self, status, headers)
|
||||
self.response = self.RESPONSE_CLASS(self, status, headers)
|
||||
return self.response.write
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user