--- XMLRpcTools/XMLRpcTools.py 2006/11/14 16:48:02 1.1 +++ XMLRpcTools/XMLRpcTools.py 2007/10/22 18:34:35 1.7 @@ -1,55 +1,91 @@ from OFS.SimpleItem import SimpleItem import xmlrpclib +import httplib from Products.PageTemplates.PageTemplateFile import PageTemplateFile import os.path from Globals import package_home +import re class XMLRpcServerProxy(SimpleItem): """makes servery proxy available for zope""" meta_type="XMLRpcServerProxy" + rpc_arg_expr='[^A-z0-9]' + manage_options= ( {'label':'Main Config','action':'mainConfigHTML'}, )+ SimpleItem.manage_options - def __init__(self,id,serverUrl): + def __init__(self,id,serverUrl,use_xmlrpc=True): """init server proxy""" self.id=id - self.serverUrl=id + self.serverUrl=serverUrl + self.use_xmlrpc = use_xmlrpc + def ServerProxy(self,serverUrl=None): """get the proxy""" if not serverUrl: serverUrl=self.serverUrl - pr=xmlrpclib.ServerProxy(serverUrl) + if self.use_xmlrpc: + pr = xmlrpclib.ServerProxy(serverUrl) + else: + pr = httplib.HTTPConnection(serverUrl) return pr + def eval(self,method,argument): """do proxy request""" - #only letters are allowed - method=re.sub('[^A-z]','',method) - argument=re.sub('[^A-z]','',argument) + server=self.ServerProxy() - sr=self.ServerProxy() - mtstr="""sr.%s('%s')"""%(method,argument) + if self.use_xmlrpc: + # for XML-RPC methods only letters are allowed + method=re.sub('[^A-z0-9_]','',method) + # clean argument + argument=re.sub(self.rpc_arg_expr,'',argument) + + cmd="""server.%s('%s')"""%(method,argument) + + return eval(cmd) + else: + # HTTP + # TODO: check arguments + uri = method + if argument: + uri += '?' + argument + + #print "GET: ", uri + server.request("GET", uri) + resp = server.getresponse() + data = resp.read() + #print "GOT: ", resp.status, ", ", resp.reason, " = ", data + + return data.decode('UTF-8') - - return eval(mtstr) def mainConfigHTML(self): """main config form""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageXMLRpcServerProxy.zpt')).__of__(self) return pt() - def mainConfig(self,serverUrl,RESPONSE=None): + def mainConfig(self,serverUrl,use_xmlrpc=True,rpc_arg_expr=None,RESPONSE=None): """main config""" self.serverUrl=serverUrl + if use_xmlrpc and use_xmlrpc != "no": + use_xmlrpc = True + else: + use_xmlrpc = False + + self.use_xmlrpc=use_xmlrpc + + if rpc_arg_expr is not None: + self.rpc_arg_expr = rpc_arg_expr if RESPONSE: RESPONSE.redirect("/manage_main") @@ -60,9 +96,17 @@ def manage_addXMLRpcServerProxyForm(self pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addXMLRpcServerProxy.zpt')).__of__(self) return pt() -def manage_addXMLRpcServerProxy(self,id,serverUrl,RESPONSE=None): +def manage_addXMLRpcServerProxy(self,id,serverUrl,use_xmlrpc=True,rpc_arg_expr=None,RESPONSE=None): """add the basket""" - ob=XMLRpcServerProxy(id,serverUrl) + if use_xmlrpc and use_xmlrpc != "no": + use_xmlrpc = True + else: + use_xmlrpc = False + + if rpc_arg_expr is not None: + self.rpc_arg_expr = rpc_arg_expr + + ob=XMLRpcServerProxy(id,serverUrl,use_xmlrpc) self._setObject(id, ob)