Changeset 329f61d for fedd/fedd.py


Ignore:
Timestamp:
Jun 27, 2008 6:34:17 PM (16 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-1.30, version-2.00, version-3.01, version-3.02
Children:
0a47d52
Parents:
4f4b977
Message:

basic XMLRPC

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/fedd.py

    r4f4b977 r329f61d  
    1010from M2Crypto import SSL
    1111from M2Crypto.SSL.SSLServer import SSLServer
     12import xmlrpclib
    1213
    1314from optparse import OptionParser
     
    2728        self.impl = impl
    2829
    29 class fedd_handler(BaseHTTPRequestHandler):
     30class fedd_soap_handler(BaseHTTPRequestHandler):
    3031    server_version = "ZSI/2.0 fedd/0.1 " + BaseHTTPRequestHandler.server_version
    31 
    32     namespace = 'http://www.isi.edu/faber/fedd.wsdl'
    33     methods = {
    34             'RequestAccess': 'soap_RequestAccess',
    35             }
    3632
    3733
     
    5955        """Confirm that this class implements the namespace and SOAP method"""
    6056        root = ps.body_root
    61         if root.namespaceURI != fedd_handler.namespace:
     57        if root.namespaceURI != self.server.impl.soap_namespace:
    6258            self.send_fault(Fault(Fault.Client,
    6359                'Unknown namespace "%s"' % root.namespaceURI))
    6460            return False
    65         if not fedd_handler.methods.has_key(root.localName):
    66             self.send_fault(Fault(Fault.Client, 'Unknown operation "%s"' % \
    67                     root.localName))
     61
     62        if getattr(root, 'localName', None) == None:
     63            self.send_fault(Fault(Fault.Client, 'No method"'))
    6864            return False
    6965        return True
     
    8480        if not self.check_method(ps): return
    8581        try:
    86             # We know this will work because check_method passed above
    87             method = getattr(self.server.impl,
    88                     fedd_handler.methods[ps.body_root.localName])
    89             resp = method(ps, fedid(cert=self.request.get_peer_cert()))
     82            resp = self.server.impl.soap_dispatch(ps.body_root.localName, ps,
     83                    fedid(cert=self.request.get_peer_cert()))
    9084        except Fault, f:
    9185            self.send_fault(f)
     
    9791            self.send_xml(str(sw))
    9892
     93class fedd_xmlrpc_handler(BaseHTTPRequestHandler):
     94    server_version = "ZSI/2.0 fedd/0.1 " + BaseHTTPRequestHandler.server_version
     95
     96    def send_xml(self, text, code=200):
     97        """Send an XML document as reply"""
     98        self.send_response(code)
     99        self.send_header('Content-type', 'text/xml; charset="utf-8"')
     100        self.send_header('Content-Length', str(len(text)))
     101        self.end_headers()
     102        self.wfile.write(text)
     103        self.wfile.flush()
     104
     105    def do_POST(self):
     106        """Treat an HTTP POST request as an XMLRPC service call"""
     107
     108        resp = None
     109        data = None
     110        cl = int(self.headers['content-length'])
     111        data = self.rfile.read(cl)
     112        params, method = xmlrpclib.loads(data)
     113
     114        try:
     115            resp = self.server.impl.xmlrpc_dispatch(method, params,
     116                        fedid(cert=self.request.get_peer_cert()))
     117            data = xmlrpclib.dumps((resp,), methodresponse=True)
     118        except Fault, f:
     119            xf = xmlrpclib.Fault(f.code, f.string)
     120            data = xmlrpclib.dumps(xf, methodresponse=True)
     121            resp = None
     122        except xmlrpclib.Fault, f:
     123            data = xmlrpclib.dumps(f, methodresponse=True)
     124            resp = None
     125
     126        self.send_xml(data)
     127
     128
    99129class fedd_opts(OptionParser):
    100130    """Encapsulate option processing in this class, rather than in main"""
     
    103133                version="0.1")
    104134
    105         self.set_defaults(host="localhost", port=23235, debug=0)
     135        self.set_defaults(host="localhost", port=23235,
     136                transport="soap",debug=0)
    106137
    107138        self.add_option("-d", "--debug", action="count", dest="debug",
     
    113144        self.add_option("-p", "--port", action="store", type="int",
    114145                dest="port", help="Port to listen on (default %default)")
     146        self.add_option("-x","--transport", action="store", type="choice",
     147                choices=("xmlrpc", "soap"),
     148                help="Transport for request (xmlrpc|soap) (Default: %default)")
    115149        self.add_option("--trace", action="store_const", dest="tracefile",
    116150                const=sys.stderr, help="Print SOAP exchange to stderr")
     
    140174            raise
    141175
    142 s = fedd_server(SOAP_port, fedd_handler, ctx, impl)
     176if opts.transport == "soap":
     177    s = fedd_server(SOAP_port, fedd_soap_handler, ctx, impl)
     178elif opts.transport == "xmlrpc":
     179    s = fedd_server(SOAP_port, fedd_xmlrpc_handler, ctx, impl)
     180else:
     181    s = None
     182
    143183s.serve_forever()
Note: See TracChangeset for help on using the changeset viewer.