
Hello. We're using twisted.web.xmlrpc to serve an xmlrpclib client, so python-to-python. We'd like to pass None through the rpc connection on occasion. There's a flag in the standard lib to allow this to serialize ( send allow_none=True to the xmlrpclib.Server() ) We're getting this error from the twisted resource when we try to serialize 'None': Fault: <Fault 8002: "can't serialize output"> I know that the twisted resources uses the stock xmlrpclib, but how can we tell it to allow None to serialize the twisted way? Thanks.

Matt Feifarek wrote:
We'd like to pass None through the rpc connection on occasion. There's a flag in the standard lib to allow this to serialize ( send allow_none=True to the xmlrpclib.Server() )
We're getting this error from the twisted resource when we try to serialize 'None':
Fault: <Fault 8002: "can't serialize output">
I know that the twisted resources uses the stock xmlrpclib, but how can we tell it to allow None to serialize the twisted way?
With the current twisted.web.xmlrpc, you can't. (You'd need to patch that to optionally give an allow_none flag to everything using dumps/loads.) Why do people want to break the perfectly nice standard, anyway? Return a tuple (False, ) for None and (True, stuff) for stuff, or something..

On Wednesday 15 June 2005 23:59, Tommi Virtanen wrote:
Matt Feifarek wrote:
We'd like to pass None through the rpc connection on occasion. There's a flag in the standard lib to allow this to serialize ( send allow_none=True to the xmlrpclib.Server() )
We're getting this error from the twisted resource when we try to serialize 'None':
Fault: <Fault 8002: "can't serialize output">
I know that the twisted resources uses the stock xmlrpclib, but how can we tell it to allow None to serialize the twisted way?
With the current twisted.web.xmlrpc, you can't. (You'd need to patch that to optionally give an allow_none flag to everything using dumps/loads.)
Why do people want to break the perfectly nice standard, anyway? Return a tuple (False, ) for None and (True, stuff) for stuff, or something..
(I know I'm a little late to this discussion, but I thought I'd reply to the thread for those who keep the mailing list for reference, like I do). Whereas Tommi is strictly correct when he says, "Why do people want to break the perfectly nice standard?" in that it's generally a Good Thing to stick to standards, it's not always as simple as he implies: not all lookups are simple ones that return nice simple scalar values that can be wrapped up in two-tuples. Personally, I think the absence of a "None" concept from the XML-RPC standard is astounding, and that the decision to adhere strictly to the standard or not should be up to the developer, since only he can make the decision as to whether the allow_none hack is worse than alternative workarounds. One way would be to write wrappers that recurse through the data structure just before serialization and after deserialization and use magical strings like "NULLVALUE") but this is a really nasty hack and affects performance, since you're effectively walking the tree twice. I'm moving some multithreaded xmlrpclib servers to Twisted; some of them return structured data that ultimately comes from a database. Both the *existence* of the column and the *absence* of a defined value are important to the client application. Since the original servers used allow_none, I'd like that to be allowed via Twisted's xmlrpc.py. The trivial patch below is against SVN head. Note that rather than adding a construction argument to xmlrpc.XMLRPC, it simply adds a class attribute which defaults to False (this means that users don't need to subclass xmlrpc.XMLRPC): class MyServer ( xmlrpc.XMLRPC ): allow_none = True def xmlrpc_Foo ( self, ... ): ... Note that the modification to xmlrpclib.dumps when serializing the Fault is technically not needed; it's just there for completeness, just in case a hook for user-created Fault objects is added in the future. Could this patch (or something like it) be committed to SVN, please? Thanks, Ricky Index: xmlrpc.py =================================================================== --- xmlrpc.py (revision 14375) +++ xmlrpc.py (working copy) @@ -93,6 +93,8 @@ isLeaf = 1 separator = '.' + allow_none = False + def __init__(self): resource.Resource.__init__(self) self.subHandlers = {} @@ -128,10 +130,12 @@ if not isinstance(result, Fault): result = (result,) try: - s = xmlrpclib.dumps(result, methodresponse=1) + s = xmlrpclib.dumps(result, methodresponse=1, + allow_none = self.allow_none) except: f = Fault(self.FAILURE, "can't serialize output") - s = xmlrpclib.dumps(f, methodresponse=1) + s = xmlrpclib.dumps(f, methodresponse=1, + allow_none = self.allow_none ) request.setHeader("content-length", str(len(s))) request.write(s) request.finish()
participants (3)
-
kgi
-
Matt Feifarek
-
Tommi Virtanen