Hello,

The Twisted XML-RPC server does not come with system.multicall, a de facto 
standard method which allows a batch of methods to be called in a single 
request.

I wrote an implementation which handles deferred results and ensures that 
exceptions in one method call do not prevent the other methods from 
executing.

I had to add to the XMLRPCIntrospection class in order to include my 
method in the system namespace, even though it is not really an 
introspection method. It's also possible to subclass XMLRPCIntrospection
from outside of xmlrpc.py and use putSubHandler instead of 
xmlrpc.addIntrospection to create the "system" namespace.

Anyhow, let me know what you think. Patch follows. Thanks for making 
Twisted such a joy to read and use.

Dave


--- /usr/share/pyshared/twisted/web/xmlrpc.py   2008-09-05 
02:18:26.000000000 -0700
+++ xmlrpc.py   2009-05-01 10:58:39.000000000 -0700
@@ -246,6 +246,33 @@
      xmlrpc_methodSignature.signature = [['array', 'string'],
                                          ['string', 'string']]

+    def xmlrpc_multicall(self, calls):
+        """
+        Boxcar multiple RPC calls in one request.
+        """
+        results = []
+        for call in calls:
+            name = call['methodName']
+            params = call['params']
+            method = self._xmlrpc_parent._getFunction(name)
+            try:
+                d = defer.maybeDeferred(method, *params)
+                g = defer.waitForDeferred(d)
+                yield g
+                result = [g.getResult()]
+            except Fault, f:
+                result = {'faultCode': f.faultCode,
+                          'faultString': f.faultString}
+            except Exception, e:
+                log.err(e)
+                result = {'faultCode': self.FAILURE,
+                          'faultString': 'error'}
+            results.append(result)
+        yield results
+
+    xmlrpc_multicall = defer.deferredGenerator(xmlrpc_multicall)
+    xmlrpc_multicall.signature = [['array', 'array']]
+

  def addIntrospection(xmlrpc):
      """

_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web

Reply via email to