From ef5bd55c3095b59d52d5a5ad5cda032892284543 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Mon, 11 May 2009 01:07:22 +0000 Subject: SSL: client side read based on server-provided content length (allows graceful ssl shutdowns to work, makes server portable 0.9.5.7-trunk) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5215 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Proxy.py | 39 +++++++++++++++++++++++++++++++++++++++ src/lib/SSLServer.py | 4 +--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/lib/Proxy.py b/src/lib/Proxy.py index 864756f49..de2941a3c 100644 --- a/src/lib/Proxy.py +++ b/src/lib/Proxy.py @@ -94,6 +94,45 @@ class XMLRPCTransport(xmlrpclib.Transport): https._setup(http) return https + def request(self, host, handler, request_body, verbose=0): + '''send request to server and return response''' + h = self.make_connection(host) + self.send_request(h, handler, request_body) + self.send_host(h, host) + self.send_user_agent(h) + self.send_content(h, request_body) + + errcode, errmsg, headers = h.getreply() + msglen = int(headers.dict['content-length']) + + if errcode != 200: + raise ProtocolError(host + handler, errcode, errmsg, headers) + + self.verbose = verbose + + return self._get_response(h.getfile(), msglen) + + def _get_response(self, fd, length): + # read response from input file/socket, and parse it + recvd = 0 + + p, u = self.getparser() + + while recvd < length: + rlen = min(length - recvd, 1024) + response = fd.read(rlen) + recvd += len(response) + if not response: + break + if self.verbose: + print "body:", repr(response), len(response) + p.feed(response) + + fd.close() + p.close() + + return u.close() + def ComponentProxy (url, user=None, password=None, key=None, cert=None, ca=None): """Constructs proxies to components. diff --git a/src/lib/SSLServer.py b/src/lib/SSLServer.py index c29f0233b..a3840f71f 100644 --- a/src/lib/SSLServer.py +++ b/src/lib/SSLServer.py @@ -191,9 +191,7 @@ class XMLRPCRequestHandler (SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): self.wfile.flush() self.wfile.close() self.rfile.close() - #self.connection.unwrap() - self.connection.shutdown(1) - + self.connection.unwrap() class XMLRPCServer (SocketServer.ThreadingMixIn, SSLServer, XMLRPCDispatcher, object): -- cgit v1.2.3-1-g7c22