def _marshaled_dispatch(self, data, dispatch_method=None, path=None):
"""Dispatches an JSON-RPC method from marshalled (JSON) data.
JSON-RPC methods are dispatched from the marshalled (JSON) 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
SimpleJSONRPCRequestHandler.do_POST) but overriding the
existing method through subclassing is the prefered means
of changing method dispatch behavior.
"""
rawreq = json.loads(data, object_hook=JSONDecoder())
req_id = rawreq.get('id', 0)
method = rawreq['method']
params = rawreq.get('params', [])
response = {'id': req_id}
try:
# generate response
if dispatch_method is not None:
response['result'] = dispatch_method(method, params)
else:
response['result'] = self._dispatch(method, params)
except (UserError, UserWarning, NotLogged,
ConcurrencyException), exception:
response['error'] = exception.args
except Exception:
tb_s = ''.join(traceback.format_exception(*sys.exc_info()))
for path in sys.path:
tb_s = tb_s.replace(path, '')
# report exception back to server
response['error'] = (str(sys.exc_value), tb_s)
return json.dumps(response, cls=JSONEncoder)
评论列表
文章目录