def parse_call(self, obj): """ Parses a JSON request. """ # Get ID, Notification if None # This is actually incorrect, as IDs can be null by spec (rare) request_id = obj.get('id', None) # Check for required parameters jsonrpc = obj.get('jsonrpc', None) method = obj.get('method', None) if not jsonrpc or not method: return ProtocolError(-32600) # Validate parameters params = obj.get('params', []) if type(params) not in (list, dict): return ProtocolError(-32602) # Parse Request kwargs = {} if type(params) is dict: kwargs = params params = [] handler = self.json_request.get_handler(method) error_code = None message = None if handler: try: response = handler(*params, **kwargs) return response except Exception: logger.error('Error calling handler %s' % method) message = traceback.format_exc().splitlines()[-1] error_code = -32603 else: error_code = -32601 return ProtocolError(error_code, message=message)