Example #1
0
    def _get_error_and_status(self, exc, data, proc):
        if isinstance(exc, TypeError) and proc:
            params = data.get('params')
            if isinstance(params, dict):
                args, kwargs = (), params
            else:
                args, kwargs = tuple(params or ()), {}
            msg = checkarity(proc, args, kwargs, discount=1)
        else:
            msg = None

        rpc_id = data.get('id') if isinstance(data, dict) else None
        res = {'id': rpc_id, 'jsonrpc': self.version}
        code = getattr(exc, 'fault_code', None)
        if not code:
            code = -32602 if msg else -32603
        msg = msg or str(exc) or 'JSON RPC exception'
        if code == -32603:
            logger.exception(msg)
        else:
            logger.warning(msg)
        res['error'] = {
            'code': code,
            'message': msg,
            'data': getattr(exc, 'data', '')
        }

        return res, getattr(exc, 'status', 400)
Example #2
0
 def _call(self, request):
     response = request.response
     data = {}
     exc_info = None
     callable = None
     try:
         try:
             data = yield from as_coroutine(request.body_data())
         except ValueError:
             raise InvalidRequest(
                 status=415, msg='Content-Type must be application/json')
         if data.get('jsonrpc') != self.version:
             raise InvalidRequest(
                 'jsonrpc must be supplied and equal to "%s"' %
                 self.version)
         params = data.get('params')
         if isinstance(params, dict):
             args, kwargs = (), params
         else:
             args, kwargs = tuple(params or ()), {}
         #
         callable = self.get_handler(data.get('method'))
         result = yield from as_coroutine(callable(request, *args,
                                                   **kwargs))
     except Exception as exc:
         result = exc
         exc_info = sys.exc_info()
     else:
         try:
             json.dumps(result)
         except Exception as exc:
             result = exc
             exc_info = sys.exc_info()
     #
     res = {'id': data.get('id'), "jsonrpc": self.version}
     if exc_info:
         msg = None
         code = getattr(result, 'fault_code', None)
         if not code:
             if isinstance(result, TypeError) and callable:
                 msg = checkarity(callable, args, kwargs, discount=1)
             code = -32602 if msg else -32603
         msg = msg or str(result) or 'JSON RPC exception'
         code = getattr(result, 'fault_code', code)
         if code == -32603:
             logger.error(msg, exc_info=exc_info)
         else:
             logger.warning(msg)
         error = {
             'code': code,
             'message': msg,
             'data': getattr(result, 'data', '')
         }
         response.status_code = getattr(result, 'status', 400)
         res['error'] = error
     else:
         res['result'] = result
     return res
Example #3
0
 def testArity2(self):
     self.assertEqual(checkarity(f2, (3,), {}), None)
     self.assertEqual(checkarity(f2, (3,), {'c': 4}), None)
     self.assertEqual(checkarity(f2, (3, 4), {}),
                      '"f2" takes 1 positional parameters. 2 given.')
     self.assertEqual(checkarity(f2, (), {}),
                      '"f2" takes at least 1 parameters. 0 given.')
     self.assertEqual(checkarity(f2, (4, 5, 6), {}),
                      '"f2" takes 1 positional parameters. 3 given.')
     self.assertEqual(checkarity(f2, (), {'a': 3, 'b': 5}), None)
     self.assertEqual(checkarity(f2, (), {'a': 3, 'c': 5}), None)
     self.assertEqual(checkarity(f2, (), {'b': 3, 'c': 5}),
                      '"f2" has missing "a" parameter.')
     self.assertEqual(checkarity(f2, (), {'a': 3, 'c': 5, 'd': 6}), None)
Example #4
0
 def _call(self, request):
     response = request.response
     data = {}
     exc_info = None
     callable = None
     try:
         try:
             data = yield from as_coroutine(request.body_data())
         except ValueError:
             raise InvalidRequest(
                 status=415, msg='Content-Type must be application/json')
         if data.get('jsonrpc') != self.version:
             raise InvalidRequest(
                 'jsonrpc must be supplied and equal to "%s"' %
                 self.version)
         params = data.get('params')
         if isinstance(params, dict):
             args, kwargs = (), params
         else:
             args, kwargs = tuple(params or ()), {}
         #
         callable = self.get_handler(data.get('method'))
         result = yield from as_coroutine(
             callable(request, *args, **kwargs))
     except Exception as exc:
         result = exc
         exc_info = sys.exc_info()
     else:
         try:
             json.dumps(result)
         except Exception as exc:
             result = exc
             exc_info = sys.exc_info()
     #
     res = {'id': data.get('id'), "jsonrpc": self.version}
     if exc_info:
         msg = None
         code = getattr(result, 'fault_code', None)
         if not code:
             if isinstance(result, TypeError) and callable:
                 msg = checkarity(callable, args, kwargs, discount=1)
             code = -32602 if msg else -32603
         msg = msg or str(result) or 'JSON RPC exception'
         code = getattr(result, 'fault_code', code)
         if code == -32603:
             logger.error(msg, exc_info=exc_info)
         else:
             logger.warning(msg)
         error = {'code': code,
                  'message': msg,
                  'data': getattr(result, 'data', '')}
         response.status_code = getattr(result, 'status', 400)
         res['error'] = error
     else:
         res['result'] = result
     return res
Example #5
0
 def _(self, *args, **kwargs):
     request = args[0]
     if request_handler:
         kwargs = request_handler(request, format, kwargs)
     try:
         return func(*args, **kwargs)
     except TypeError:
         msg = checkarity(func, args, kwargs)
         if msg:
             raise InvalidParams('Invalid Parameters. %s' % msg)
         else:
             raise
Example #6
0
 def _call(self, request):
     response = request.response
     data = {}
     # No content type - set it equal to application/json
     if not response.content_type:
         response.content_type = 'application/json'
     try:
         try:
             data = yield request.body_data()
         except ValueError:
             raise InvalidRequest(
                 status=415, msg='Content-Type must be application/json')
         if response.content_type not in JSON_CONTENT_TYPES:
             raise InvalidRequest(
                 status=415, msg='Content-Type must be application/json')
         if data.get('jsonrpc') != self.version:
             raise InvalidRequest(
                 'jsonrpc must be supplied and equal to "%s"' %
                 self.version)
         params = data.get('params')
         if isinstance(params, dict):
             args, kwargs = (), params
         else:
             args, kwargs = tuple(params or ()), {}
         #
         callable = self.get_handler(data.get('method'))
         result = yield callable(request, *args, **kwargs)
     except Exception:
         result = sys.exc_info()
     #
     result = maybe_failure(result)
     res = {'id': data.get('id'), "jsonrpc": self.version}
     if isinstance(result, Failure):
         msg = None
         error = result.error
         code = getattr(error, 'fault_code', -32603)
         if isinstance(error, TypeError):
             msg = checkarity(callable, args, kwargs, discount=1)
         msg = msg or str(error) or 'JSON RPC exception'
         if code == -32603:
             result.log(msg=msg, level='error')
         else:
             result.log(msg=msg, level='warning')
         result = {'code': code,
                   'message': msg,
                   'data': getattr(error, 'data', '')}
         request.response.status_code = getattr(error, 'status', 500)
         res['error'] = result
     else:
         res['result'] = result
     yield res
Example #7
0
 def testArity1(self):
     self.assertEqual(checkarity(f1, (3,), {}), None)
     self.assertEqual(checkarity(f1, (3, 4), {}), None)
     self.assertEqual(checkarity(f1, (), {}),
                      '"f1" takes at least 1 parameters. 0 given.')
     self.assertEqual(checkarity(f1, (4, 5, 6), {}),
                      '"f1" takes at most 2 parameters. 3 given.')
     self.assertEqual(checkarity(f1, (), {'a': 3, 'b': 5}), None)
     self.assertEqual(checkarity(f1, (), {'a': 3, 'c': 5}),
                      '"f1" does not accept "c" parameter.')
     self.assertEqual(checkarity(f1, (), {'a': 3, 'c': 5, 'd': 6}),
                      '"f1" takes at most 2 parameters. 3 given.')
Example #8
0
    async def _call(self, request, data):
        exc_info = None
        proc = None
        try:
            if (not isinstance(data, dict)
                    or data.get('jsonrpc') != self.version
                    or 'id' not in data):
                raise InvalidRequest(
                    'jsonrpc must be supplied and equal to "%s"' %
                    self.version)
            params = data.get('params')
            if isinstance(params, dict):
                args, kwargs = (), params
            else:
                args, kwargs = tuple(params or ()), {}
            #
            proc = self.get_handler(data.get('method'))
            result = await as_coroutine(proc(request, *args, **kwargs))
        except Exception as exc:
            result = exc
            exc_info = sys.exc_info()
        else:
            try:
                json.dumps(result)
            except Exception as exc:
                result = exc
                exc_info = sys.exc_info()
        #
        if exc_info:
            if isinstance(result, TypeError) and proc:
                msg = checkarity(proc, args, kwargs, discount=1)
            else:
                msg = None

            rpc_id = data.get('id') if isinstance(data, dict) else None

            res, status = self._get_error_and_status(result,
                                                     msg=msg,
                                                     rpc_id=rpc_id,
                                                     exc_info=exc_info)
        else:
            res = {
                'id': data.get('id'),
                'jsonrpc': self.version,
                'result': result
            }
            status = 200

        return res, status
Example #9
0
    def _call(self, request, data):
        exc_info = None
        procedure = None
        try:
            if (not isinstance(data, dict) or
                    data.get('jsonrpc') != self.version or
                    'id' not in data):
                raise InvalidRequest(
                    'jsonrpc must be supplied and equal to "%s"' %
                    self.version
                )
            params = data.get('params')
            if isinstance(params, dict):
                args, kwargs = (), params
            else:
                args, kwargs = tuple(params or ()), {}
            #
            procedure = self.get_handler(data.get('method'))
            result = yield from as_coroutine(
                procedure(request, *args, **kwargs))
        except Exception as exc:
            result = exc
            exc_info = sys.exc_info()
        else:
            try:
                json.dumps(result)
            except Exception as exc:
                result = exc
                exc_info = sys.exc_info()
        #
        if exc_info:
            if isinstance(result, TypeError) and procedure:
                msg = checkarity(procedure, args, kwargs, discount=1)
            else:
                msg = None

            rpc_id = data.get('id') if isinstance(data, dict) else None

            res, status = self._get_error_and_status(
                result, msg=msg, rpc_id=rpc_id, exc_info=exc_info)
        else:
            res = {
                'id': data.get('id'),
                'jsonrpc': self.version,
                'result': result
            }
            status = 200

        return res, status
Example #10
0
 def _call(self, request):
     response = request.response
     data = {}
     try:
         try:
             data = yield request.body_data()
         except ValueError:
             raise InvalidRequest(
                 status=415, msg='Content-Type must be application/json')
         if data.get('jsonrpc') != self.version:
             raise InvalidRequest(
                 'jsonrpc must be supplied and equal to "%s"' %
                 self.version)
         params = data.get('params')
         if isinstance(params, dict):
             args, kwargs = (), params
         else:
             args, kwargs = tuple(params or ()), {}
         #
         callable = self.get_handler(data.get('method'))
         result = yield callable(request, *args, **kwargs)
     except Exception:
         result = sys.exc_info()
     #
     result = maybe_failure(result)
     res = {'id': data.get('id'), "jsonrpc": self.version}
     if isinstance(result, Failure):
         msg = None
         error = result.error
         code = getattr(error, 'fault_code', -32603)
         if isinstance(error, TypeError):
             msg = checkarity(callable, args, kwargs, discount=1)
         msg = msg or str(error) or 'JSON RPC exception'
         if code == -32603:
             result.log(msg=msg, level='error')
         else:
             result.log(msg=msg, level='warning')
         result = {'code': code,
                   'message': msg,
                   'data': getattr(error, 'data', '')}
         request.response.status_code = getattr(error, 'status', 500)
         res['error'] = result
     else:
         res['result'] = result
     yield res
Example #11
0
    async def _call(self, request, data):
        exc_info = None
        proc = None
        try:
            if not isinstance(data, dict) or data.get("jsonrpc") != self.version or "id" not in data:
                raise InvalidRequest('jsonrpc must be supplied and equal to "%s"' % self.version)
            params = data.get("params")
            if isinstance(params, dict):
                args, kwargs = (), params
            else:
                args, kwargs = tuple(params or ()), {}
            #
            proc = self.get_handler(data.get("method"))
            result = await as_coroutine(proc(request, *args, **kwargs))
        except Exception as exc:
            result = exc
            exc_info = sys.exc_info()
        else:
            try:
                json.dumps(result)
            except Exception as exc:
                result = exc
                exc_info = sys.exc_info()
        #
        if exc_info:
            if isinstance(result, TypeError) and proc:
                msg = checkarity(proc, args, kwargs, discount=1)
            else:
                msg = None

            rpc_id = data.get("id") if isinstance(data, dict) else None

            res, status = self._get_error_and_status(result, msg=msg, rpc_id=rpc_id, exc_info=exc_info)
        else:
            res = {"id": data.get("id"), "jsonrpc": self.version, "result": result}
            status = 200

        return res, status
Example #12
0
def arity_check(func, *args, **kwargs):
    discount = kwargs.pop('discount', 0)
    return checkarity(func, args, kwargs, discount=discount)
Example #13
0
def rpcerror(func, args, kwargs, discount=0):
    msg = checkarity(func, args, kwargs, discount=discount)
    if msg:
        raise InvalidParams('Invalid Parameters. %s' % msg)
    else:
        raise