import json import sys ################################################## # User defined methods go here ################################################## def addMeth(args): a = float(args[0]) b = float(args[1]) return [a + b] def multMeth(args): a = float(args[0]) b = float(args[1]) return [a * b] def echoMeth(args): return args methods = {} methods["add"] = addMeth methods["mult"] = multMeth methods["echo"] = echoMeth ################################################## # End of user defined methods ################################################## #Begining of JSON RPC server code class RPCError(Exception): def __init__(self, message, id, code): self.message = message self.id = id self.code = code def __str__(self): return "Request id: " + str(self.id) + ' Error: ' + self.message def processRequest(req): id = None if "id" in req: id = req["id"] if type(id) != int and type(id) != float: raise RPCError("Invalid id field", None, -32600) if not "jsonrpc" in req: raise RPCError("Missing jsonrpc field", id, -32600) if req["jsonrpc"] != "2.0": raise RPCError("Invalid jsonrpc value: " + str(req["jsonrpc"]), id, -32600) if not "method" in req: raise RPCError("Missing method field", id, -32600) methName = req["method"] if not methName in methods: raise RPCError("Unknown method: " + methName, id, -32602) if not "params" in req: raise RPCError("Missing params field", id, -32600) params = req["params"] meth = methods[methName] result = meth(params) response = {"jsonrpc": "2.0", "id": id, "result": result} return response # main loop for line in sys.stdin: try: req = json.loads(line) res = processRequest(req) print(json.dumps(res)) sys.stdout.flush() except RPCError as err: res = {"jsonrpc": "2.0", "id": err.id, "error" : { "message": err.message, "code" : err.code}} print(json.dumps(res)) sys.stdout.flush()