changeset 1138:ef565839dada

server: don't convert failure in errback to jsonrpclib.Fault anymore: failure in bridgeCall was always converted to jsonrpclib.Fault, resulting in loss of useful debugging data. This conversion as been modified to the signal handler which is only used by Libervia Legacy. Note that txJsonRPC will be totally removed for 0.8 release.
author Goffi <goffi@goffi.org>
date Fri, 11 Jan 2019 16:38:25 +0100
parents dfd6545a205a
children e45480b6ba24
files libervia/server/server.py
diffstat 1 files changed, 19 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libervia/server/server.py	Sun Jan 06 17:45:44 2019 +0100
+++ b/libervia/server/server.py	Fri Jan 11 16:38:25 2019 +0100
@@ -527,8 +527,16 @@
         jsonrpc.JSONRPC.__init__(self)
         self.sat_host = sat_host
 
+    def _bridgeCallEb(self, failure_):
+        """Raise a jsonrpclib failure for the frontend"""
+        return failure.Failure(
+                jsonrpclib.Fault(C.ERRNUM_BRIDGE_ERRBACK, failure_.value.classname)
+            )
+
     def asyncBridgeCall(self, method_name, *args, **kwargs):
-        return self.sat_host.bridgeCall(method_name, *args, **kwargs)
+        d = self.sat_host.bridgeCall(method_name, *args, **kwargs)
+        d.addErrback(self._bridgeCallEb)
+        return d
 
 
 class MethodHandler(JSONRPCMethodManager):
@@ -1574,13 +1582,18 @@
         parsed = jsonrpclib.loads(request.content.read())
         profile = session_iface.ISATSession(_session).profile
         if not profile:
+            # FIXME: this method should not use _cbRender
+            #        but all txJsonRPC code will be removed in 0.8 in favor of webRTC
+            #        and it is currently used only with Libervia legacy app,
+            #        so we do a is_jsonp workaround for now
+            self.is_jsonp = False
             # user is not identified, we return a jsonrpc fault
             fault = jsonrpclib.Fault(
                 C.ERRNUM_LIBERVIA, C.NOT_ALLOWED
             )  # FIXME: define some standard error codes for libervia
             return jsonrpc.JSONRPC._cbRender(
                 self, fault, request, parsed.get("id"), parsed.get("jsonrpc")
-            )  # pylint: disable=E1103
+            )
         self.request = request
         return jsonrpc.JSONRPC.render(self, request)
 
@@ -2026,12 +2039,8 @@
                     Exception("Multiple return arguments not supported")
                 d.callback(args[0])
 
-        def _errback(result):
-            d.errback(
-                failure.Failure(
-                    jsonrpclib.Fault(C.ERRNUM_BRIDGE_ERRBACK, result.classname)
-                )
-            )
+        def _errback(failure_):
+            d.errback(failure.Failure(failure_))
 
         kwargs["callback"] = _callback
         kwargs["errback"] = _errback
@@ -2198,7 +2207,7 @@
         try:
             connected = yield self.bridgeCall(connect_method, profile, password)
         except Exception as failure_:
-            fault = failure_.faultString
+            fault = failure_.classname
             self.waiting_profiles.purgeRequest(profile)
             if fault in ("PasswordError", "ProfileUnknownError"):
                 log.info(u"Profile {profile} doesn't exist or the submitted password is "
@@ -2213,7 +2222,7 @@
                            u"connection is broken)"))
                 raise exceptions.TimeOutError
             else:
-                log.error(u'Unmanaged fault string "{fault}" in errback for the '
+                log.error(u'Unmanaged fault class "{fault}" in errback for the '
                           u'connection of profile {profile}'.format(
                               fault=fault, profile=profile))
                 raise failure.Failure(exceptions.InternalError(fault))