Annotation of XMLRpcTools/XMLRpcTools.py, revision 1.11
1.1 dwinter 1:
2: from OFS.SimpleItem import SimpleItem
3: import xmlrpclib
1.5 casties 4: import httplib
1.1 dwinter 5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
6: import os.path
7: from Globals import package_home
1.2 dwinter 8: import re
1.1 dwinter 9:
10: class XMLRpcServerProxy(SimpleItem):
11: """makes servery proxy available for zope"""
12:
13: meta_type="XMLRpcServerProxy"
14:
1.11 ! casties 15: rpc_no_arg_expr='[^A-z0-9]'
1.6 casties 16:
1.1 dwinter 17: manage_options= (
18: {'label':'Main Config','action':'mainConfigHTML'},
19: )+ SimpleItem.manage_options
20:
1.5 casties 21: def __init__(self,id,serverUrl,use_xmlrpc=True):
1.1 dwinter 22: """init server proxy"""
23: self.id=id
1.5 casties 24: self.serverUrl=serverUrl
25: self.use_xmlrpc = use_xmlrpc
26:
1.1 dwinter 27:
28: def ServerProxy(self,serverUrl=None):
29: """get the proxy"""
30: if not serverUrl:
31: serverUrl=self.serverUrl
32:
1.5 casties 33: if self.use_xmlrpc:
34: pr = xmlrpclib.ServerProxy(serverUrl)
35: else:
36: pr = httplib.HTTPConnection(serverUrl)
1.1 dwinter 37:
38: return pr
39:
1.5 casties 40:
1.11 ! casties 41: def eval(self,method,argument,outputUnicode=True):
1.1 dwinter 42: """do proxy request"""
1.6 casties 43: server=self.ServerProxy()
1.1 dwinter 44:
1.5 casties 45: if self.use_xmlrpc:
1.6 casties 46: # for XML-RPC methods only letters are allowed
1.7 casties 47: method=re.sub('[^A-z0-9_]','',method)
1.6 casties 48: # clean argument
1.11 ! casties 49: argument=re.sub(self.rpc_no_arg_expr,'',argument)
1.5 casties 50:
1.6 casties 51: cmd="""server.%s('%s')"""%(method,argument)
1.5 casties 52:
1.6 casties 53: return eval(cmd)
1.5 casties 54: else:
55: # HTTP
56: # TODO: check arguments
57: uri = method
58: if argument:
59: uri += '?' + argument
60:
61: #print "GET: ", uri
1.6 casties 62: server.request("GET", uri)
63: resp = server.getresponse()
1.5 casties 64: data = resp.read()
65: #print "GOT: ", resp.status, ", ", resp.reason, " = ", data
1.11 ! casties 66: if outputUnicode:
! 67: return data.decode('UTF-8')
! 68: else:
! 69: return data
1.1 dwinter 70:
1.11 ! casties 71: def eval2(self,method,argument1,argument2,outputUnicode=True):
1.8 casties 72: """do proxy request"""
73: server=self.ServerProxy()
74:
75: if self.use_xmlrpc:
76: # for XML-RPC methods only letters are allowed
77: method=re.sub('[^A-z0-9_]','',method)
78: # clean argument
1.11 ! casties 79: argument1=re.sub(self.rpc_no_arg_expr,'',argument1)
! 80: argument2=re.sub(self.rpc_no_arg_expr,'',argument2)
1.8 casties 81:
1.9 casties 82: cmd="""server.%s('%s','%s')"""%(method,argument1,argument2)
1.8 casties 83:
84: return eval(cmd)
85: else:
86: # HTTP
87: # TODO: check arguments
88: uri = method
89: if argument1:
90: uri += '?' + argument1 + argument2
91:
92: #print "GET: ", uri
93: server.request("GET", uri)
94: resp = server.getresponse()
95: data = resp.read()
96: #print "GOT: ", resp.status, ", ", resp.reason, " = ", data
97:
1.11 ! casties 98: if outputUnicode:
! 99: return data.decode('UTF-8')
! 100: else:
! 101: return data
1.8 casties 102:
1.1 dwinter 103:
104: def mainConfigHTML(self):
105: """main config form"""
106: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageXMLRpcServerProxy.zpt')).__of__(self)
107: return pt()
108:
1.11 ! casties 109: def mainConfig(self,serverUrl,use_xmlrpc=True,rpc_no_arg_expr=None,RESPONSE=None):
1.1 dwinter 110: """main config"""
111:
112: self.serverUrl=serverUrl
113:
1.5 casties 114: if use_xmlrpc and use_xmlrpc != "no":
115: use_xmlrpc = True
116: else:
117: use_xmlrpc = False
118:
119: self.use_xmlrpc=use_xmlrpc
1.1 dwinter 120:
1.11 ! casties 121: if rpc_no_arg_expr is not None:
! 122: self.rpc_no_arg_expr = rpc_no_arg_expr
1.6 casties 123:
1.1 dwinter 124: if RESPONSE:
1.10 casties 125: RESPONSE.redirect("manage_main")
1.1 dwinter 126:
127:
128: def manage_addXMLRpcServerProxyForm(self):
1.11 ! casties 129: """add the XMLRpcServerProxy"""
1.1 dwinter 130: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addXMLRpcServerProxy.zpt')).__of__(self)
131: return pt()
132:
1.11 ! casties 133: def manage_addXMLRpcServerProxy(self,id,serverUrl,use_xmlrpc=True,rpc_no_arg_expr=None,RESPONSE=None):
! 134: """add the XMLRpcServerProxy"""
! 135: if use_xmlrpc is not None and use_xmlrpc != "no":
1.5 casties 136: use_xmlrpc = True
137: else:
138: use_xmlrpc = False
139:
140: ob=XMLRpcServerProxy(id,serverUrl,use_xmlrpc)
1.1 dwinter 141:
1.11 ! casties 142: if rpc_no_arg_expr is not None:
! 143: ob.rpc_no_arg_expr = rpc_no_arg_expr
! 144:
1.1 dwinter 145: self._setObject(id, ob)
146:
147: if RESPONSE is not None:
1.10 casties 148: RESPONSE.redirect('manage_main')
149:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>