From 68fa9caf3898edb358e67f2a4d194036f8e27750 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Fri, 19 Dec 2008 12:57:38 +0000 Subject: [PATCH] ganeti.http: Add support for private data in HTTP requests Reviewed-by: amishchenko --- lib/http/server.py | 48 +++++++++++++++++++++--------------- test/ganeti.http_unittest.py | 1 + 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/lib/http/server.py b/lib/http/server.py index a751a15a9..f63bc504e 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 da71f7f7a..1394f3ddf 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""" -- GitLab