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)
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
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)
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
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
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
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.')
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
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
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
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
def arity_check(func, *args, **kwargs): discount = kwargs.pop('discount', 0) return checkarity(func, args, kwargs, discount=discount)
def rpcerror(func, args, kwargs, discount=0): msg = checkarity(func, args, kwargs, discount=discount) if msg: raise InvalidParams('Invalid Parameters. %s' % msg) else: raise