86 |
86 |
# Response attributes
|
87 |
87 |
self.resp_headers = {}
|
88 |
88 |
|
|
89 |
# Private data for request handler (useful in combination with
|
|
90 |
# authentication)
|
|
91 |
self.private = None
|
|
92 |
|
89 |
93 |
|
90 |
94 |
class _HttpServerToClientMessageWriter(http.HttpMessageWriter):
|
91 |
95 |
"""Writes an HTTP response to client.
|
... | ... | |
308 |
312 |
handler_context = _HttpServerRequest(self.request_msg)
|
309 |
313 |
|
310 |
314 |
try:
|
311 |
|
# Authentication, etc.
|
312 |
|
self.server.PreHandleRequest(handler_context)
|
313 |
|
|
314 |
|
# Call actual request handler
|
315 |
|
result = self.server.HandleRequest(handler_context)
|
316 |
|
except (http.HttpException, KeyboardInterrupt, SystemExit):
|
317 |
|
raise
|
318 |
|
except Exception, err:
|
319 |
|
logging.exception("Caught exception")
|
320 |
|
raise http.HttpInternalServerError(message=str(err))
|
321 |
|
except:
|
322 |
|
logging.exception("Unknown exception")
|
323 |
|
raise http.HttpInternalServerError(message="Unknown error")
|
324 |
|
|
325 |
|
# TODO: Content-type
|
326 |
|
encoder = http.HttpJsonConverter()
|
327 |
|
self.response_msg.start_line.code = http.HTTP_OK
|
328 |
|
self.response_msg.body = encoder.Encode(result)
|
329 |
|
self.response_msg.headers = handler_context.resp_headers
|
330 |
|
self.response_msg.headers[http.HTTP_CONTENT_TYPE] = encoder.CONTENT_TYPE
|
|
315 |
try:
|
|
316 |
# Authentication, etc.
|
|
317 |
self.server.PreHandleRequest(handler_context)
|
|
318 |
|
|
319 |
# Call actual request handler
|
|
320 |
result = self.server.HandleRequest(handler_context)
|
|
321 |
except (http.HttpException, KeyboardInterrupt, SystemExit):
|
|
322 |
raise
|
|
323 |
except Exception, err:
|
|
324 |
logging.exception("Caught exception")
|
|
325 |
raise http.HttpInternalServerError(message=str(err))
|
|
326 |
except:
|
|
327 |
logging.exception("Unknown exception")
|
|
328 |
raise http.HttpInternalServerError(message="Unknown error")
|
|
329 |
|
|
330 |
# TODO: Content-type
|
|
331 |
encoder = http.HttpJsonConverter()
|
|
332 |
self.response_msg.start_line.code = http.HTTP_OK
|
|
333 |
self.response_msg.body = encoder.Encode(result)
|
|
334 |
self.response_msg.headers = handler_context.resp_headers
|
|
335 |
self.response_msg.headers[http.HTTP_CONTENT_TYPE] = encoder.CONTENT_TYPE
|
|
336 |
finally:
|
|
337 |
# No reason to keep this any longer, even for exceptions
|
|
338 |
handler_context.private = None
|
331 |
339 |
|
332 |
340 |
def _SendResponse(self):
|
333 |
341 |
"""Sends the response to the client.
|