diff --git a/lib/http.py b/lib/http.py index d0e930e3e7f54a0caa107128be268000388af280..459e4c872db47c534df135c064eee09bbdc89120 100644 --- a/lib/http.py +++ b/lib/http.py @@ -412,7 +412,7 @@ class _HttpSocketBase(object): self._ssl_cert.digest("md5") == cert.digest("md5")) -class _HttpConnectionHandler(object): +class HttpServerRequestExecutor(object): """Implements server side of HTTP This class implements the server side of HTTP. It's based on code of Python's @@ -465,13 +465,27 @@ class _HttpConnectionHandler(object): self.should_fork = False + logging.info("Connection from %s:%s", client_addr[0], client_addr[1]) try: - self._ReadRequest() - self._ReadPostData() - except HTTPException, err: - self._SetErrorStatus(err) + try: + try: + try: + # Read, parse and handle request + self._ReadRequest() + self._ReadPostData() + self._HandleRequest() + except HTTPException, err: + self._SetErrorStatus(err) + finally: + # Try to send a response + self._SendResponse() + self._Close() + except SocketClosed: + pass + finally: + logging.info("Disconnected %s:%s", client_addr[0], client_addr[1]) - def Close(self): + def _Close(self): if not self.wfile.closed: self.wfile.flush() self.wfile.close() @@ -512,7 +526,7 @@ class _HttpConnectionHandler(object): self.response_content_type = self.error_content_type self.response_body = self.error_message_format % values - def HandleRequest(self): + def _HandleRequest(self): """Handle the actual request. Calls the actual handler function and converts exceptions into HTTP errors. @@ -549,7 +563,7 @@ class _HttpConnectionHandler(object): except HTTPException, err: self._SetErrorStatus(err) - def SendResponse(self): + def _SendResponse(self): """Sends response to the client. """ @@ -794,26 +808,9 @@ class HttpServer(_HttpSocketBase): pid = os.fork() if pid == 0: # Child process - logging.info("Connection from %s:%s", client_addr[0], client_addr[1]) - try: - try: - try: - handler = None - try: - # Read, parse and handle request - handler = _HttpConnectionHandler(self, connection, client_addr, - self._fileio_class) - handler.HandleRequest() - finally: - # Try to send a response - if handler: - handler.SendResponse() - handler.Close() - except SocketClosed: - pass - finally: - logging.info("Disconnected %s:%s", client_addr[0], client_addr[1]) + HttpServerRequestExecutor(self, connection, client_addr, + self._fileio_class) except: logging.exception("Error while handling request from %s:%s", client_addr[0], client_addr[1])