def parse_request_json(json_string): """ Returns RPC-request as dictionary or as list with requests """ # No JSON-String if json_string is None: raise rpcerror.InvalidRequest() # Parse try: data = json.loads(json_string) except JsonParseError: traceback_info = "".join(traceback.format_exception(*sys.exc_info())) raise rpcerror.ParseError(data=traceback_info) # Create request(s) if isinstance(data, list): requests = [] for item in data: requests.append( Request(jsonrpc=item.get("jsonrpc"), method=str(item.get("method", "")), id=item.get("id"), params=item.get("params", []))) return requests else: return Request(jsonrpc=data.get("jsonrpc"), method=str(data.get("method", "")), id=data.get("id"), params=data.get("params", []))
def parse_request_json(json_string): """ Returns RPC-request as dictionary or as list with requests """ # No JSON-String if json_string is None: raise rpcerror.InvalidRequest() # Parse try: data = json.loads(json_string) except JsonParseError: traceback_info = "".join(traceback.format_exception(*sys.exc_info())) raise rpcerror.ParseError(data = traceback_info) # Create request(s) if isinstance(data, list): requests = [] for item in data: requests.append(Request( jsonrpc = item.get("jsonrpc"), method = str(item.get("method", "")), id = item.get("id"), params = item.get("params", []) )) return requests else: return Request( jsonrpc = data.get("jsonrpc"), method = str(data.get("method", "")), id = data.get("id"), params = data.get("params", []) )
def do_GET(self): """ Handles HTTP-GET-Request """ # Parse URL query query = urlparse.parse_qs(urllib.splitquery(self.path)[1]) # jsonrpc jsonrpc = query.get("jsonrpc") if jsonrpc: jsonrpc = jsonrpc[0] # id id = query.get("id") if id: id = id[0] # method method = query.get("method") if method: method = method[0] # params args = [] kwargs = {} params = query.get("params") if params: params = json.loads(params[0]) if isinstance(params, list): args = params kwargs = {} elif isinstance(params, dict): args = [] kwargs = params # Create JSON reqeust string request_dict = rpcrequest.create_request_dict(method, *args, **kwargs) request_dict["jsonrpc"] = jsonrpc request_dict["id"] = id request_json = json.dumps(request_dict) # Call response_json = self.call(request_json) # Return result self.send_response(code = httplib.OK) self.set_content_type_json() self.set_no_cache() self.set_content_length(len(response_json)) self.end_headers() self.wfile.write(response_json)
def do_GET(self): """ Handles HTTP-GET-Request """ # Parse URL query query = urlparse.parse_qs(urllib.splitquery(self.path)[1]) # jsonrpc jsonrpc = query.get("jsonrpc") if jsonrpc: jsonrpc = jsonrpc[0] # id id = query.get("id") if id: id = id[0] # method method = query.get("method") if method: method = method[0] # params args = [] kwargs = {} params = query.get("params") if params: params = json.loads(params[0]) if isinstance(params, list): args = params kwargs = {} elif isinstance(params, dict): args = [] kwargs = params # Create JSON reqeust string request_dict = rpcrequest.create_request_dict(method, *args, **kwargs) request_dict["jsonrpc"] = jsonrpc request_dict["id"] = id request_json = json.dumps(request_dict) # Call response_json = self.call(request_json) # Return result self.send_response(code=httplib.OK) self.set_content_type_json() self.set_no_cache() self.set_content_length(len(response_json)) self.end_headers() self.wfile.write(response_json)
def handle_cgi_request(methods = None): """ Gets the JSON-RPC request from CGI environment and returns the result to STDOUT """ import cgi import cgitb cgitb.enable() # get response-body request_json = sys.stdin.read() if request_json: # POST request_json = urlparse.unquote(request_json) else: # GET args = [] kwargs = {} fields = cgi.FieldStorage() jsonrpc = fields.getfirst("jsonrpc") id = fields.getfirst("id") method = fields.getfirst("method") params = fields.getfirst("params") if params: params = json.loads(params) if isinstance(params, list): args = params kwargs = {} elif isinstance(params, dict): args = [] kwargs = params # Create JSON request string request_dict = rpcrequest.create_request_dict(method, *args, **kwargs) request_dict["jsonrpc"] = jsonrpc request_dict["id"] = id request_json = json.dumps(request_dict) # Call response_json = rpclib.JsonRpc(methods = methods).call(request_json) # Return headers print "Content-Type: application/json" print "Cache-Control: no-cache" print "Pragma: no-cache" print # Return result print response_json
def parse_response_json(json_string): """ Returns a RPC-Response or a list with RPC-Responses """ data = json.loads(json_string) if isinstance(data, list): retlist = [] for response in data: retlist.append(Response.from_dict(response)) return retlist else: return Response.from_dict(data)
def handle_cgi_request(methods = None): """ Gets the JSON-RPC request from CGI environment and returns the result to STDOUT """ import cgi import cgitb cgitb.enable() # get response-body request_json = sys.stdin.read() if request_json: # POST request_json = urlparse.unquote(request_json) else: # GET args = [] kwargs = {} fields = cgi.FieldStorage() jsonrpc = fields.getfirst("jsonrpc") id = fields.getfirst("id") method = fields.getfirst("method") params = fields.getfirst("params") if params: params = json.loads(params) if isinstance(params, list): args = params kwargs = {} elif isinstance(params, dict): args = [] kwargs = params # Create JSON reqeust string request_dict = rpcrequest.create_request_dict(method, *args, **kwargs) request_dict["jsonrpc"] = jsonrpc request_dict["id"] = id request_json = json.dumps(request_dict) # Call response_json = rpclib.JsonRpc(methods = methods).call(request_json) # Return headers print "Content-Type: application/json" print "Cache-Control: no-cache" print "Pragma: no-cache" print # Return result print response_json
def from_string(cls, json_string): """ Returns a Response-object or a list with Response-objects """ if not json_string: return data = json.loads(json_string) if isinstance(data, list): retlist = [] for response in data: retlist.append(cls.from_dict(response)) return retlist else: return cls.from_dict(data)
def from_string(cls, json_string): """ Parses the Json-string and returns a Request-object or a list with Request-objects. :returns: Request-object or list with Request-objects :rtype: Request """ # No JSON-String if json_string is None: raise rpcerror.InvalidRequest() # Parse try: data = json.loads(json_string) except JsonParseError: traceback_info = "".join(traceback.format_exception(*sys.exc_info())) raise rpcerror.ParseError(data = traceback_info) # Create request(s) if isinstance(data, list): requests = [] for item in data: requests.append(cls( jsonrpc = item.get("jsonrpc"), method = item.get("method"), id = item.get("id"), params = item.get("params") )) return requests else: return cls( jsonrpc = data.get("jsonrpc"), method = data.get("method"), id = data.get("id"), params = data.get("params") )
def from_string(cls, json_string): """ Parses the Json-string and returns a Request-object or a list with Request-objects. :returns: Request-object or list with Request-objects :rtype: Request """ # No JSON-String if json_string is None: raise rpcerror.InvalidRequest() # Parse try: data = json.loads(json_string) except JsonParseError: traceback_info = "".join( traceback.format_exception(*sys.exc_info())) raise rpcerror.ParseError(data=traceback_info) # Create request(s) if isinstance(data, list): requests = [] for item in data: requests.append( cls(jsonrpc=item.get("jsonrpc"), method=item.get("method"), id=item.get("id"), params=item.get("params"))) return requests else: return cls(jsonrpc=data.get("jsonrpc"), method=data.get("method"), id=data.get("id"), params=data.get("params"))
def request_handler(self, *args, **kwargs): """ Json-RPC Handler """ if cherrypy.request.method == "GET": # GET # jsonrpc jsonrpc = kwargs.get("jsonrpc") if jsonrpc: jsonrpc = jsonrpc[0] # id id = kwargs.get("id") if id: id = id[0] # method method = kwargs.get("method") if method: method = method[0] else: # Bad Request raise cherrypy.HTTPError(httplib.BAD_REQUEST) # params _args = [] _kwargs = {} params = kwargs.get("params") if params: params = json.loads(params[0]) if isinstance(params, list): _args = params _kwargs = {} elif isinstance(params, dict): _args = [] _kwargs = params # Create JSON request string request_dict = rpcrequest.create_request_dict( method, *_args, **_kwargs) request_dict["jsonrpc"] = jsonrpc request_dict["id"] = id request_json = json.dumps(request_dict) else: # POST if "gzip" in cherrypy.request.headers.get("Content-Encoding", ""): request_json = decompress(cherrypy.request.body.read()) else: request_json = cherrypy.request.body.read() # Call method result_string = self.call(request_json) or "" # Return JSON-String cherrypy.response.headers["Cache-Control"] = "no-cache" cherrypy.response.headers["Pragma"] = "no-cache" cherrypy.response.headers["Content-Type"] = "application/json" if "gzip" in cherrypy.request.headers.get("Accept-Encoding", ""): # Gzip-compressed cherrypy.response.headers["Content-Encoding"] = "gzip" return compress(result_string, compress_level=5) else: # uncompressed return result_string