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