@param sock: Target socket
@type request_msg: http.HttpMessage
@param request_msg: Request message, required to determine whether
- response may have a message body
+ response may have a message body
@type response_msg: http.HttpMessage
@param response_msg: Response message
@type write_timeout: float
return http.HttpClientToServerStartLine(method, path, version)
-class _HttpServerRequestExecutor(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
- BaseHTTPServer, from both version 2.4 and 3k. It does not support non-ASCII
- character encodings. Keep-alive connections are not supported.
+ This class implements the server side of HTTP. It's based on code of
+ Python's BaseHTTPServer, from both version 2.4 and 3k. It does not
+ support non-ASCII character encodings. Keep-alive connections are
+ not supported.
"""
# The default request version. This only affects responses up until
# Operate in non-blocking mode
self.sock.setblocking(0)
- logging.info("Connection from %s:%s", client_addr[0], client_addr[1])
+ logging.debug("Connection from %s:%s", client_addr[0], client_addr[1])
try:
request_msg_reader = None
force_close = True
self.sock.close()
self.sock = None
finally:
- logging.info("Disconnected %s:%s", client_addr[0], client_addr[1])
+ logging.debug("Disconnected %s:%s", client_addr[0], client_addr[1])
def _ReadRequest(self):
"""Reads a request sent by client.
headers[http.HTTP_CONTENT_TYPE] = self.error_content_type
self.response_msg.headers = headers
- self.response_msg.body = self.error_message_format % values
+ self.response_msg.body = self._FormatErrorMessage(values)
+ def _FormatErrorMessage(self, values):
+ """Formats the body of an error message.
+
+ @type values: dict
+ @param values: dictionary with keys code, message and explain.
+ @rtype: string
+ @return: the body of the message
+
+ """
+ return self.error_message_format % values
class HttpServer(http.HttpBase):
"""Generic HTTP server class
MAX_CHILDREN = 20
def __init__(self, mainloop, local_address, port,
- ssl_params=None, ssl_verify_peer=False):
+ ssl_params=None, ssl_verify_peer=False,
+ request_executor_class=None):
"""Initializes the HTTP server
@type mainloop: ganeti.daemon.Mainloop
@type ssl_params: HttpSslParams
@param ssl_params: SSL key and certificate
@type ssl_verify_peer: bool
- @param ssl_verify_peer: Whether to require client certificate and compare
- it with our certificate
+ @param ssl_verify_peer: Whether to require client certificate
+ and compare it with our certificate
+ @type request_executor_class: class
+ @param request_executor_class: an class derived from the
+ HttpServerRequestExecutor class
"""
http.HttpBase.__init__(self)
+ if request_executor_class is None:
+ self.request_executor = HttpServerRequestExecutor
+ else:
+ self.request_executor = request_executor_class
+
self.mainloop = mainloop
self.local_address = local_address
self.port = port
if pid == 0:
# Child process
try:
- _HttpServerRequestExecutor(self, connection, client_addr)
+ self.request_executor(self, connection, client_addr)
except Exception:
logging.exception("Error while handling request from %s:%s",
client_addr[0], client_addr[1])