import http.server
import pjrpc
class JsonRpcHandler(http.server.BaseHTTPRequestHandler):
"""
JSON-RPC handler.
"""
def do_POST(self):
"""
Handles JSON-RPC request.
"""
content_type = self.headers.get('Content-Type')
if content_type != 'application/json':
self.send_response(http.HTTPStatus.UNSUPPORTED_MEDIA_TYPE)
return
try:
content_length = int(self.headers.get('Content-Length', -1))
request_text = self.rfile.read(content_length).decode()
except UnicodeDecodeError:
self.send_response(http.HTTPStatus.BAD_REQUEST)
return
response_text = self.server.dispatcher.dispatch(request_text, context=self)
if response_text is None:
self.send_response(http.HTTPStatus.OK)
else:
self.send_response(http.HTTPStatus.OK)
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(response_text.encode())
class JsonRpcServer(http.server.HTTPServer):
"""
:py:class:`http.server.HTTPServer` based JSON-RPC server.
:param path: JSON-RPC handler base path
:param kwargs: arguments to be passed to the dispatcher :py:class:`pjrpc.server.Dispatcher`
"""
def __init__(self, server_address, RequestHandlerClass=JsonRpcHandler, bind_and_activate=True, **kwargs):
super().__init__(server_address, RequestHandlerClass, bind_and_activate)
self._dispatcher = pjrpc.server.Dispatcher(**kwargs)
@property
def dispatcher(self):
"""
JSON-RPC method dispatcher.
"""
return self._dispatcher