[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Add support to Xend XML-RPC server for HTTP/1.1 Keep-Alive.
# HG changeset patch # User anthony@xxxxxxxxxxxxxxxxxxxxx # Node ID 0fe87421cc8026fdbb13a5ac85c936fd951d3c0e # Parent 410c81420109918fa9ebeac3a350a9d13ccf463f Add support to Xend XML-RPC server for HTTP/1.1 Keep-Alive. This patch fixes a few bugs in the Python SimpleXMLRPC server and enables HTTP/1.1 by default. This allows a client to use Keep-Alive. Keep-Alive improves performance by eliminating the overhead of connection setup and, more importantly, avoids credential caching when executing multiple commands over a secure connection. Signed-off-by: Anthony Liguori <aliguori@xxxxxxxxxx> --- tools/python/xen/util/xmlrpclib2.py | 33 +++++++++++++++++++++++++++++++-- 1 files changed, 31 insertions(+), 2 deletions(-) diff -r 410c81420109 -r 0fe87421cc80 tools/python/xen/util/xmlrpclib2.py --- a/tools/python/xen/util/xmlrpclib2.py Mon Jun 19 17:43:04 2006 +0100 +++ b/tools/python/xen/util/xmlrpclib2.py Tue Jun 20 10:25:18 2006 +0100 @@ -40,6 +40,31 @@ from xen.xend.XendLogging import log # # It assumes that the RPC handler is /RPC2. This probably needs to be improved +# We're forced to subclass the RequestHandler class so that we can work around +# some bugs in Keep-Alive handling and also enabled it by default +class XMLRPCRequestHandler(SimpleXMLRPCRequestHandler): + protocol_version = "HTTP/1.1" + + # this is inspired by SimpleXMLRPCRequestHandler's do_POST but differs + # in a few non-trivial ways + # 1) we never generate internal server errors. We let the exception + # propagate so that it shows up in the Xend debug logs + # 2) we don't bother checking for a _dispatch function since we don't + # use one + # 3) we never shutdown the connection. This appears to be a bug in + # SimpleXMLRPCServer.py as it breaks HTTP Keep-Alive + def do_POST(self): + data = self.rfile.read(int(self.headers["content-length"])) + rsp = self.server._marshaled_dispatch(data) + + self.send_response(200) + self.send_header("Content-Type", "text/xml") + self.send_header("Content-Length", str(len(rsp))) + self.end_headers() + + self.wfile.write(rsp) + self.wfile.flush() + class HTTPUnixConnection(HTTPConnection): def connect(self): self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) @@ -93,6 +118,10 @@ class ServerProxy(xmlrpclib.ServerProxy) class TCPXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer): allow_reuse_address = True + + def __init__(self, addr, requestHandler=XMLRPCRequestHandler, + logRequests=1): + SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests) def _marshaled_dispatch(self, data, dispatch_method = None): params, method = xmlrpclib.loads(data) @@ -131,10 +160,10 @@ class TCPXMLRPCServer(SocketServer.Threa # It implements proper support for allow_reuse_address by # unlink()'ing an existing socket. -class UnixXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): +class UnixXMLRPCRequestHandler(XMLRPCRequestHandler): def address_string(self): try: - return SimpleXMLRPCRequestHandler.address_string(self) + return XMLRPCRequestHandler.address_string(self) except ValueError, e: return self.client_address[:2] _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |