Fix async req/resp handlers.

This commit is contained in:
Paul Davis 2010-03-23 15:40:14 -04:00
parent 2242be27cf
commit e4b7263314
2 changed files with 19 additions and 8 deletions

View File

@ -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.")

View File

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