From ca378af28663e304bfa969bdeb43b08ce138a950 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 5 May 2006 14:17:57 -0400 Subject: [PATCH] Print local traceback on XMLRPC server exceptions --- chat/chat.py | 2 +- chat/network.py | 34 ++++++++++++++++++++++++++++++++++ chat/p2p.py | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/chat/chat.py b/chat/chat.py index a5f3fc8a..2948c263 100755 --- a/chat/chat.py +++ b/chat/chat.py @@ -341,7 +341,7 @@ class GroupChat(Chat): def _buddy_recv_message(self, sender, msg): chat = sender.chat() if not chat: - chat = BuddyChat(self, sender) + chat = BuddyChat(self._parent, sender) sender.set_chat(chat) chat.activity_connect_to_shell() chat.recv_message(message) diff --git a/chat/network.py b/chat/network.py index dc80a943..fa35548a 100644 --- a/chat/network.py +++ b/chat/network.py @@ -75,6 +75,40 @@ class GlibXMLRPCServer(GlibTCPServer, SimpleXMLRPCServer.SimpleXMLRPCDispatcher) SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self) GlibTCPServer.__init__(self, addr, requestHandler) + def _marshaled_dispatch(self, data, dispatch_method = None): + """Dispatches an XML-RPC method from marshalled (XML) data. + + XML-RPC methods are dispatched from the marshalled (XML) data + using the _dispatch method and the result is returned as + marshalled data. For backwards compatibility, a dispatch + function can be provided as an argument (see comment in + SimpleXMLRPCRequestHandler.do_POST) but overriding the + existing method through subclassing is the prefered means + of changing method dispatch behavior. + """ + + params, method = xmlrpclib.loads(data) + + # generate response + try: + if dispatch_method is not None: + response = dispatch_method(method, params) + else: + response = self._dispatch(method, params) + # wrap response in a singleton tuple + response = (response,) + response = xmlrpclib.dumps(response, methodresponse=1) + except Fault, fault: + response = xmlrpclib.dumps(fault) + except: + traceback.print_exc() + # report exception back to server + response = xmlrpclib.dumps( + xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)) + ) + + return response + class GroupChatController(object): diff --git a/chat/p2p.py b/chat/p2p.py index df223d1e..fb21eb94 100644 --- a/chat/p2p.py +++ b/chat/p2p.py @@ -13,7 +13,7 @@ class GroupRequestHandler(object): def message(self, message): address = network.get_authinfo() - self._group.recv(address[0], message) + self._group.recv(address, message) class Owner: instance = None