diff --git a/lib/http/server.py b/lib/http/server.py index a751a15a9688ce22a9744f1f978e85e8745e38a0..f63bc504eeb72b942d3e19153fc978478855673e 100644 --- a/lib/http/server.py +++ b/lib/http/server.py @@ -86,6 +86,10 @@ class _HttpServerRequest(object): # Response attributes self.resp_headers = {} + # Private data for request handler (useful in combination with + # authentication) + self.private = None + class _HttpServerToClientMessageWriter(http.HttpMessageWriter): """Writes an HTTP response to client. @@ -308,26 +312,30 @@ class _HttpServerRequestExecutor(object): handler_context = _HttpServerRequest(self.request_msg) try: - # Authentication, etc. - self.server.PreHandleRequest(handler_context) - - # Call actual request handler - result = self.server.HandleRequest(handler_context) - except (http.HttpException, KeyboardInterrupt, SystemExit): - raise - except Exception, err: - logging.exception("Caught exception") - raise http.HttpInternalServerError(message=str(err)) - except: - logging.exception("Unknown exception") - raise http.HttpInternalServerError(message="Unknown error") - - # TODO: Content-type - encoder = http.HttpJsonConverter() - self.response_msg.start_line.code = http.HTTP_OK - self.response_msg.body = encoder.Encode(result) - self.response_msg.headers = handler_context.resp_headers - self.response_msg.headers[http.HTTP_CONTENT_TYPE] = encoder.CONTENT_TYPE + try: + # Authentication, etc. + self.server.PreHandleRequest(handler_context) + + # Call actual request handler + result = self.server.HandleRequest(handler_context) + except (http.HttpException, KeyboardInterrupt, SystemExit): + raise + except Exception, err: + logging.exception("Caught exception") + raise http.HttpInternalServerError(message=str(err)) + except: + logging.exception("Unknown exception") + raise http.HttpInternalServerError(message="Unknown error") + + # TODO: Content-type + encoder = http.HttpJsonConverter() + self.response_msg.start_line.code = http.HTTP_OK + self.response_msg.body = encoder.Encode(result) + self.response_msg.headers = handler_context.resp_headers + self.response_msg.headers[http.HTTP_CONTENT_TYPE] = encoder.CONTENT_TYPE + finally: + # No reason to keep this any longer, even for exceptions + handler_context.private = None def _SendResponse(self): """Sends the response to the client. diff --git a/test/ganeti.http_unittest.py b/test/ganeti.http_unittest.py index da71f7f7aaec374b91f58954d2abee117269965a..1394f3ddfc2f86fa21ad4a36a4df568da5d2e853 100755 --- a/test/ganeti.http_unittest.py +++ b/test/ganeti.http_unittest.py @@ -78,6 +78,7 @@ class TestMisc(unittest.TestCase): self.assert_(hasattr(server_request, "request_headers")) self.assert_(hasattr(server_request, "request_body")) self.assert_(isinstance(server_request.resp_headers, dict)) + self.assert_(hasattr(server_request, "private")) def testServerSizeLimits(self): """Test HTTP server size limits"""