File:  [Repository] / XMLRpcTools / XMLRpcTools.py
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Tue Oct 23 17:48:09 2007 UTC (16 years, 8 months ago) by casties
Branches: MAIN
CVS tags: HEAD
added eval2 for methods with two arguments

    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>