def fromRawObject(obj): if obj.get("jsonrpc") != "2.0": raise exception.JsonRpcInvalidRequestError( "Wrong protocol version", request=obj ) method = obj.get("method") if method is None: raise exception.JsonRpcInvalidRequestError( "missing method header in method", request=obj ) reqId = obj.get("id") # when sending notifications id is not provided params = obj.get('params', []) if not isinstance(params, (list, dict)): raise exception.JsonRpcInvalidRequestError( "wrong params type", request=obj ) return JsonRpcRequest(method, protect_passwords(params), reqId)
def fromRawObject(obj): if obj.get("jsonrpc") != "2.0": raise exception.JsonRpcInvalidRequestError( "wrong protocol version", request=obj) if "result" not in obj and "error" not in obj: raise exception.JsonRpcInvalidRequestError( "missing result or error info", request=obj) result = obj.get("result") error = None if "error" in obj: error = exception.JsonRpcServerError.from_dict(obj["error"]) reqId = obj.get("id") return JsonRpcResponse(result, error, reqId)
def _parseMessage(self, obj): client, server_address, context, msg = obj ctx = _JsonRpcServeRequestContext(client, server_address, context) try: rawRequests = json.loads(msg) except: ctx.addResponse( JsonRpcResponse(None, exception.JsonRpcParseError(), None)) ctx.sendReply() return if isinstance(rawRequests, list): # Empty batch request if len(rawRequests) == 0: ctx.addResponse( JsonRpcResponse( None, exception.JsonRpcInvalidRequestError( "request batch is empty", request=rawRequests), None)) ctx.sendReply() return else: # From this point on we know it's always a list rawRequests = [rawRequests] # JSON Parsed handling each request requests = [] for rawRequest in rawRequests: try: req = JsonRpcRequest.fromRawObject(rawRequest) requests.append(req) except vdsmexception.VdsmException as err: ctx.addResponse(JsonRpcResponse(None, err, None)) except: ctx.addResponse( JsonRpcResponse(None, exception.JsonRpcInternalError(), None)) ctx.setRequests(requests) # No request was built successfully or is only notifications if ctx.counter == 0: ctx.sendReply() for request in requests: self._runRequest(ctx, request)