Index: Lib/test/test_xmlrpc.py =================================================================== --- Lib/test/test_xmlrpc.py (revision 72833) +++ Lib/test/test_xmlrpc.py (working copy) @@ -703,7 +703,7 @@ def make_connection(self, host): conn = xmlrpclib.Transport.make_connection(self, host) - conn._conn.sock = self.fake_socket = FakeSocket() + conn.sock = self.fake_socket = FakeSocket() return conn class TransportSubclassTestCase(unittest.TestCase): @@ -729,15 +729,15 @@ req = self.issue_request(TestTransport) self.assert_("X-Test: test_custom_user_agent\r\n" in req) - def test_send_host(self): + def test_send_extra_headers(self): class TestTransport(FakeTransport): - def send_host(self, conn, host): - xmlrpclib.Transport.send_host(self, conn, host) - conn.putheader("X-Test", "test_send_host") + def send_extra_headers(self, conn): + xmlrpclib.Transport.send_extra_headers(self, conn) + conn.putheader("X-Test", "test_extra_headers") req = self.issue_request(TestTransport) - self.assert_("X-Test: test_send_host\r\n" in req) + self.assert_("X-Test: test_extra_headers\r\n" in req) def test_send_request(self): class TestTransport(FakeTransport): Index: Lib/xmlrpclib.py =================================================================== --- Lib/xmlrpclib.py (revision 72833) +++ Lib/xmlrpclib.py (working copy) @@ -1212,7 +1212,8 @@ def __init__(self, use_datetime=0): self._use_datetime = use_datetime - + self._connection = None + self._extra_headers = [] ## # Send a complete request, and parse the response. # @@ -1230,22 +1231,22 @@ h.set_debuglevel(1) self.send_request(h, handler, request_body) - self.send_host(h, host) + self.send_extra_headers(h) self.send_user_agent(h) self.send_content(h, request_body) - errcode, errmsg, headers = h.getreply(buffering=True) + response = h.getresponse(buffering=True) - if errcode != 200: + if response.status != 200: raise ProtocolError( host + handler, - errcode, errmsg, - headers + response.status, response.reason, + response.msg, ) self.verbose = verbose - return self.parse_response(h.getfile()) + return self.parse_response(response) ## # Create parser. @@ -1294,10 +1295,13 @@ # @return A connection handle. def make_connection(self, host): + if self._connection: + return self._connection # create a HTTP connection object from a host descriptor import httplib - host, extra_headers, x509 = self.get_host_info(host) - return httplib.HTTP(host) + host, self._extra_headers, x509 = self.get_host_info(host) + self._connection = httplib.HTTPConnection(host) + return self._connection ## # Send request header. @@ -1310,14 +1314,12 @@ connection.putrequest("POST", handler) ## - # Send host name. + # Send extra headers. # # @param connection Connection handle. - # @param host Host name. - def send_host(self, connection, host): - host, extra_headers, x509 = self.get_host_info(host) - connection.putheader("Host", host) + def send_extra_headers(self, connection): + extra_headers = self._extra_headers if extra_headers: if isinstance(extra_headers, DictType): extra_headers = extra_headers.items() @@ -1349,20 +1351,19 @@ # @param file Stream. # @return Response tuple and target method. - def parse_response(self, file): - # read response from input file/socket, and parse it + def parse_response(self, response): + # read response data from httpresponse, and parse it p, u = self.getparser() while 1: - response = file.read(1024) - if not response: + data = response.read(1024) + if not data: break if self.verbose: - print "body:", repr(response) - p.feed(response) + print "body:", repr(data) + p.feed(data) - file.close() p.close() return u.close() @@ -1376,18 +1377,14 @@ # FIXME: mostly untested def make_connection(self, host): + if self._connection: + return self._connection # create a HTTPS connection object from a host descriptor # host may be a string, or a (host, x509-dict) tuple import httplib - host, extra_headers, x509 = self.get_host_info(host) - try: - HTTPS = httplib.HTTPS - except AttributeError: - raise NotImplementedError( - "your version of httplib doesn't support HTTPS" - ) - else: - return HTTPS(host, None, **(x509 or {})) + host, self._extra_headers, x509 = self.get_host_info(host) + self._connection = httplib.HTTPSConnection(host, None, **(x509 or {})) + return self._connection ## # Standard server proxy. This class establishes a virtual connection