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
|
"Connection: %s\r\n" % connection_hdr
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
if self.chunked:
|
||||||
|
write_chunk(self.socket, "")
|
||||||
|
|
||||||
class KeepaliveRequest(http.Request):
|
class KeepaliveRequest(http.Request):
|
||||||
|
|
||||||
|
RESPONSE_CLASS = KeepaliveResponse
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
ret = select.select([self._sock], [], [], self.conf.keepalive)
|
ret = select.select([self.socket], [], [], self.conf.keepalive)
|
||||||
if not ret[0]:
|
if not ret[0]:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
@ -63,8 +69,15 @@ class KeepaliveWorker(Worker):
|
|||||||
environ = req.read()
|
environ = req.read()
|
||||||
if not environ or not req.parser.headers:
|
if not environ or not req.parser.headers:
|
||||||
return
|
return
|
||||||
response = self.app(environ, req.start_response)
|
respiter = self.app(environ, req.start_response)
|
||||||
if response == ALREADY_HANDLED:
|
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
|
break
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
#Only send back traceback in HTTP in debug mode.
|
#Only send back traceback in HTTP in debug mode.
|
||||||
@ -73,9 +86,6 @@ class KeepaliveWorker(Worker):
|
|||||||
util.write_error(client, traceback.format_exc())
|
util.write_error(client, traceback.format_exc())
|
||||||
break
|
break
|
||||||
|
|
||||||
KeepaliveResponse(client, response, req).send()
|
|
||||||
if req.parser.should_close:
|
|
||||||
break
|
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
if e[0] != errno.EPIPE:
|
if e[0] != errno.EPIPE:
|
||||||
self.log.exception("Error processing request.")
|
self.log.exception("Error processing request.")
|
||||||
|
|||||||
@ -26,7 +26,8 @@ class RequestError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
class Request(object):
|
class Request(object):
|
||||||
|
|
||||||
|
RESPONSE_CLASS = Response
|
||||||
SERVER_VERSION = "gunicorn/%s" % __version__
|
SERVER_VERSION = "gunicorn/%s" % __version__
|
||||||
|
|
||||||
DEFAULTS = {
|
DEFAULTS = {
|
||||||
@ -165,5 +166,5 @@ class Request(object):
|
|||||||
elif self.response is not None:
|
elif self.response is not None:
|
||||||
raise AssertionError("Response headers already set!")
|
raise AssertionError("Response headers already set!")
|
||||||
|
|
||||||
self.response = Response(self, status, headers)
|
self.response = self.RESPONSE_CLASS(self, status, headers)
|
||||||
return self.response.write
|
return self.response.write
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user