JSON-RPC 2.0 handler.
(self, request)
| 34 | |
| 35 | @csrf_exempt |
| 36 | def jsonrpc(self, request): |
| 37 | """ JSON-RPC 2.0 handler.""" |
| 38 | if request.method != "POST": |
| 39 | return HttpResponseNotAllowed(["POST"]) |
| 40 | |
| 41 | request_str = request.body.decode('utf8') |
| 42 | try: |
| 43 | jsonrpc_request = JSONRPCRequest.from_json(request_str) |
| 44 | except (TypeError, ValueError, JSONRPCInvalidRequestException): |
| 45 | response = JSONRPCResponseManager.handle( |
| 46 | request_str, self.dispatcher) |
| 47 | else: |
| 48 | jsonrpc_request.params = jsonrpc_request.params or {} |
| 49 | jsonrpc_request_params = copy.copy(jsonrpc_request.params) |
| 50 | if isinstance(jsonrpc_request.params, dict): |
| 51 | jsonrpc_request.params.update(request=request) |
| 52 | |
| 53 | t1 = time.time() |
| 54 | response = JSONRPCResponseManager.handle_request( |
| 55 | jsonrpc_request, self.dispatcher) |
| 56 | t2 = time.time() |
| 57 | logger.info('{0}({1}) {2:.2f} sec'.format( |
| 58 | jsonrpc_request.method, jsonrpc_request_params, t2 - t1)) |
| 59 | |
| 60 | if response: |
| 61 | def serialize(s): |
| 62 | return json.dumps(s, cls=DatetimeDecimalEncoder) |
| 63 | |
| 64 | response.serialize = serialize |
| 65 | response = response.json |
| 66 | |
| 67 | return HttpResponse(response, content_type="application/json") |
| 68 | |
| 69 | def jsonrpc_map(self, request): |
| 70 | """ Map of json-rpc available calls. |
nothing calls this directly
no test coverage detected