commit-gnue
[Top][All Lists]
Advanced

[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,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]