[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
r5482 - in trunk/gnue-common/src/rpc/drivers: . xmlrpc/pw_xmlrpc
From: |
reinhard |
Subject: |
r5482 - in trunk/gnue-common/src/rpc/drivers: . xmlrpc/pw_xmlrpc |
Date: |
Tue, 23 Mar 2004 13:11:48 -0600 (CST) |
Author: reinhard
Date: 2004-03-23 13:11:47 -0600 (Tue, 23 Mar 2004)
New Revision: 5482
Modified:
trunk/gnue-common/src/rpc/drivers/Base.py
trunk/gnue-common/src/rpc/drivers/xmlrpc/pw_xmlrpc/ServerAdapter.py
Log:
Improved traceback transfers from server to client.
Modified: trunk/gnue-common/src/rpc/drivers/Base.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/Base.py 2004-03-23 17:53:06 UTC (rev
5481)
+++ trunk/gnue-common/src/rpc/drivers/Base.py 2004-03-23 19:11:47 UTC (rev
5482)
@@ -283,19 +283,18 @@
def raiseException (self, exception, message, event=None):
raise exception, message
-# =============================================================================
-# Support to pass exception over the wire
-# =============================================================================
+ # ---------------------------------------------------------------------------
+ # Put info for current exception into a string to transfer it over RPC
+ # ---------------------------------------------------------------------------
-def encodeException ():
- exc = sys.exc_info ()
+ def _traceback (self, count):
+ """
+ Returns the complete traceback of the exception as a string, where the
+ first count lines of the traceback are hidden.
- GDebug.printMesg (1, 'RPC detected Exception of type "%s", value: "%s".' % \
- (exc [0], exc [1]))
-
- error = string.join (traceback.format_exception (exc[0], exc[1], exc[2]), '')
-
- # remove exception object, because garbage collector can't remove it
- del(exc)
-
- return error
+ This method can be used in descendant classes to encapsulate a traceback
+ that happened on the server and send it over to the client.
+ """
+ lines = traceback.format_exception (*sys.exc_info ())
+ del lines [1:count+1]
+ return string.join (lines, '')
Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/pw_xmlrpc/ServerAdapter.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/pw_xmlrpc/ServerAdapter.py
2004-03-23 17:53:06 UTC (rev 5481)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/pw_xmlrpc/ServerAdapter.py
2004-03-23 19:11:47 UTC (rev 5482)
@@ -44,13 +44,12 @@
from gnue.common.rpc import server
from gnue.common.apps import GDebug
from gnue.common.rpc.drivers._helpers import ObjectLibrarian, DirectoryServer
-from gnue.common.rpc.drivers.Base import encodeException
from BaseHTTPServer import BaseHTTPRequestHandler;
from SimpleHTTPServer import SimpleHTTPRequestHandler;
import SocketServer
-import string, sys, os, posixpath, urllib, socket
+import string, sys, os, posixpath, urllib, socket, types
import typeconv
@@ -314,10 +313,13 @@
if (server_method!=None):
# call method with params
- result=server_method(*__params)
+ try:
+ result = server_method(*__params)
+ except:
+ return xmlrpclib.Fault (1, self._traceback (1))
+ else:
+ result = typeconv.python_to_rpc (result, server.InvalidParameter)
- result = typeconv.python_to_rpc (result, server.InvalidParameter)
-
# check if it's the close object method
elif (method=="_close"):
@@ -446,20 +448,17 @@
params, method = xmlrpclib.loads(data)
# generate response
- try:
+ response = self.server._parent.call(method, params)
- response = self.server._parent.call(method, params)
- if response==None:
- response=()
- elif type(response) != type(()):
+ if isinstance (response, xmlrpclib.Fault):
+ response = xmlrpclib.dumps (response)
+ else:
+ if response is None:
+ response = ()
+ elif not isinstance (response, types.TupleType):
response = (response,)
- except:
- # report exception back to server
- response = xmlrpclib.dumps (xmlrpclib.Fault (1, encodeException ()))
+ response = xmlrpclib.dumps (response, methodresponse = 1)
- else:
- response = xmlrpclib.dumps(response,methodresponse=1)
-
except:
# internal error, report as HTTP server error
GDebug.printMesg(1,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- r5482 - in trunk/gnue-common/src/rpc/drivers: . xmlrpc/pw_xmlrpc,
reinhard <=