Continuing my flood of XML-RPC related fun, attached is a mostly untested patch to make the RPC system use SimpleXMLRPCDispatcher. This means adding the introspection and multicall APIs too, which may help alleviate concerns about round-trips.

--Noah

PS: Is there any simple way to get a devlopment environment going? I think I have finally got the schema cleaned up enough to import, but its hard to tell if this is the right one to use (pkgbase_schema.sql).
Index: rpc.py
===================================================================
--- rpc.py      (revision 526)
+++ rpc.py      (working copy)
@@ -1,32 +1,40 @@
 import xmlrpclib
 import traceback
 from cStringIO import StringIO
+from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
 
 allowed = ('package_releases', 'package_urls', 'package_data',
     'search', 'list_packages', 'release_urls', 'release_data',
     'updated_releases', 'changelog', 'post_cheesecake_for_release')
 
-def handle_request(webui_obj):
-    webui_obj.handler.send_response(200, 'OK')
-    webui_obj.handler.send_header('Content-type', 'text/xml')
-    webui_obj.handler.send_header('charset', 'UTF-8' );
-    webui_obj.handler.end_headers()
-    try:
-        methodArgs, methodName = 
xmlrpclib.loads(webui_obj.handler.rfile.read())
-        if methodName in allowed:
-            response = globals()[methodName](webui_obj.store, *methodArgs)
-        else:
-            raise KeyError, "Method %r does not exist" % (methodName,)
-        if response is None:
-            response = ''
-        # xmlrpclib.dumps encodes Unicode as UTF-8
-        xml = xmlrpclib.dumps((response,), allow_none=True)
-        webui_obj.handler.wfile.write(xml)
-    except:
-        out = StringIO()
-        traceback.print_exc(file=out)
-        result = xmlrpclib.dumps(xmlrpclib.Fault(1, out.getvalue()))
-        webui_obj.handler.wfile.write(result)
+class RequestHandler(SimpleXMLRPCDispatcher):
+    """A request dispatcher for the PyPI XML-RPC API."""
+    
+    def __init__(self):
+        SimpleXMLRPCDispatcher.__init__(self)
+        self.register_function(list_packages)
+        self.register_function(package_releases)
+        self.register_function(release_urls)
+        self.register_function(release_urls, name='package_urls') # Deprecated
+        self.register_function(release_data)
+        self.register_function(release_data, name='package_data') # Deprecated
+        self.register_function(search)
+        self.register_function(updated_releases)
+        self.register_function(changelog)
+        self.register_function(post_cheesecake_for_release)
+        self.register_introspection_functions()
+        self.register_multicall_functions()
+    
+    def __call__(self, webui_obj):
+        webui_obj.handler.send_response(200, 'OK')
+        webui_obj.handler.send_header('Content-type', 'text/xml')
+        webui_obj.handler.send_header('charset', 'UTF-8' );
+        webui_obj.handler.end_headers()
+        data = webui_obj.handler.rfile.read()
+        def dispatch(method, params):
+            self._dispatch(method, (webui_obj.store,)+params)
+        response = self._marshaled_dispatch(data, dispatch)
+        webui_obj.handler.wfile.write(response)
 
 def list_packages(store):
     result = store.get_packages()
@@ -88,3 +96,5 @@
 
     store.save_cheesecake_score(name, version, score_data)
     store.commit()
+
+handle_request = RequestHandler()
\ No newline at end of file

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Catalog-SIG mailing list
[email protected]
http://mail.python.org/mailman/listinfo/catalog-sig

Reply via email to