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