X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2Fxmlrpcprotocol.py;h=b5e9c01f88fa769fcd11acf1befd34d9db730af8;hb=2303773af36a8798946913a6c3f4c4dd71d13d11;hp=58b19e21dc91ee669861f87d7785963670c9a92b;hpb=9d52f2be0c10d26eab55be9a930856592208a5b1;p=sfa.git diff --git a/sfa/util/xmlrpcprotocol.py b/sfa/util/xmlrpcprotocol.py index 58b19e21..b5e9c01f 100644 --- a/sfa/util/xmlrpcprotocol.py +++ b/sfa/util/xmlrpcprotocol.py @@ -1,7 +1,9 @@ -# XMLRPC-specific code for GeniClient +# XMLRPC-specific code for SFA Client +import httplib import xmlrpclib +from sfa.util.sfalogging import logger ## # ServerException, ExceptionUnmarshaller # @@ -23,20 +25,23 @@ class ExceptionUnmarshaller(xmlrpclib.Unmarshaller): # # A transport for XMLRPC that works on top of HTTPS +# python 2.7 xmlrpclib has changed its internal code +# it now calls 'getresponse' on the obj returned by make_connection +# while it used to call 'getreply' +# regardless of the version, httplib.HTTPS does implement getreply, +# while httplib.HTTPSConnection has getresponse +# so we create a dummy instance to check what's expected +need_HTTPSConnection=hasattr(xmlrpclib.Transport().make_connection('localhost'),'getresponse') + class XMLRPCTransport(xmlrpclib.Transport): key_file = None cert_file = None def make_connection(self, host): # 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" - ) + if need_HTTPSConnection: + return httplib.HTTPSConnection(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {})) else: return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {})) @@ -45,10 +50,24 @@ class XMLRPCTransport(xmlrpclib.Transport): parser = xmlrpclib.ExpatParser(unmarshaller) return parser, unmarshaller -def get_server(url, key_file, cert_file): +class XMLRPCServerProxy(xmlrpclib.ServerProxy): + def __init__(self, url, transport, allow_none=True, options=None): + # remember url for GetVersion + self.url=url + verbose = False + if options and options.debug: + verbose = True + xmlrpclib.ServerProxy.__init__(self, url, transport, allow_none=allow_none, verbose=verbose) + + def __getattr__(self, attr): + logger.debug ("xml-rpc %s method:%s"%(self.url,attr)) + return xmlrpclib.ServerProxy.__getattr__(self, attr) + + +def get_server(url, key_file, cert_file, options=None): transport = XMLRPCTransport() transport.key_file = key_file transport.cert_file = cert_file - return xmlrpclib.ServerProxy(url, transport, allow_none=True) + return XMLRPCServerProxy(url, transport, allow_none=True, options=options)