# HG changeset patch # User Thierry Florac # Date 1341402021 -7200 # Node ID 33b95dfd61428b87d70e67de694b1e92d00e642a # Parent 5fdc01c95cade364568950d3744947bb56c84d3a Improve Python 2.7 compatibility diff -r 5fdc01c95cad -r 33b95dfd6142 src/ztfy/utils/protocol/xmlrpc.py --- a/src/ztfy/utils/protocol/xmlrpc.py Wed Jul 04 08:25:39 2012 +0200 +++ b/src/ztfy/utils/protocol/xmlrpc.py Wed Jul 04 13:40:21 2012 +0200 @@ -61,6 +61,7 @@ self.timeout = timeout if self._connection_required_compat(): self.make_connection = self._make_connection_compat + self.get_response = self._get_response_compat def _connection_required_compat(self): # Compatibility code copied from EULExistDB (https://github.com/emory-libraries/eulexistdb) @@ -102,19 +103,32 @@ auth = 'Basic %s' % base64.encodestring("%s:%s" % self.credentials).strip() connection.putheader('Authorization', auth) - def request(self, host, handler, request_body, verbose=False): + # dummy request class for extracting cookies + class CookieRequest(urllib2.Request): + pass - # dummy request class for extracting cookies - class CookieRequest(urllib2.Request): - pass + # dummy response info headers helper + class CookieResponseHelper: + def __init__(self, response): + self.response = response + def getheaders(self, header): + return self.response.msg.getallmatchingheaders(header) - # dummy response class for extracting cookies - class CookieResponse: - def __init__(self, headers): - self.headers = headers - def info(self): - return self.headers + # dummy response class for extracting cookies + class CookieResponse: + def __init__(self, response): + self.response = response + def info(self): + return XMLRPCCookieAuthTransport.CookieResponseHelper(self.response) + # dummy compat response class for extracting cookies + class CompatCookieResponse: + def __init__(self, headers): + self.headers = headers + def info(self): + return self.headers + + def request(self, host, handler, request_body, verbose=False): # issue XML-RPC request connection = self.make_connection(host) self.verbose = verbose @@ -125,11 +139,25 @@ self.send_user_agent(connection) self.send_content(connection, request_body) # get response + return self.get_response(connection, host, handler) + + def get_response(self, connection, host, handler): + response = connection.getresponse() + # extract cookies from response headers + if self.cookies is not None: + crequest = XMLRPCCookieAuthTransport.CookieRequest('http://%s/' % host) + cresponse = XMLRPCCookieAuthTransport.CookieResponse(response) + self.cookies.extract_cookies(cresponse, crequest) + if response.status != 200: + raise xmlrpclib.ProtocolError(host + handler, response.status, response.reason, response.getheaders()) + return self.parse_response(response) + + def _get_response_compat(self, connection, host, handler): errcode, errmsg, headers = connection.getreply() # extract cookies from response headers - crequest = CookieRequest('http://%s/' % host) - cresponse = CookieResponse(headers) if self.cookies is not None: + crequest = XMLRPCCookieAuthTransport.CookieRequest('http://%s/' % host) + cresponse = XMLRPCCookieAuthTransport.CompatCookieResponse(headers) self.cookies.extract_cookies(cresponse, crequest) if errcode != 200: raise xmlrpclib.ProtocolError(host + handler, errcode, errmsg, headers)