61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
# See the file "LICENSE" for information about the copyright
|
|
# and warranty status of this software.
|
|
|
|
import logging
|
|
import traceback
|
|
|
|
from aiohttp import web
|
|
|
|
|
|
class ElectrumRPCServer(object):
|
|
'''ElectrumX's RPC server for localhost.'''
|
|
|
|
def __init__(self, server):
|
|
self.logger = logging.getLogger('RPCServer')
|
|
self.logger.setLevel(logging.INFO)
|
|
self.server = server
|
|
|
|
async def request_handler(self, request):
|
|
json_request = await request.json()
|
|
try:
|
|
err, result = await self.json_handler(json_request)
|
|
except Exception as e:
|
|
traceback.print_exc()
|
|
err, result = 1, 'caught exception: {}'.format(e)
|
|
|
|
id_ = request.get('id')
|
|
if err is None:
|
|
response = {
|
|
'id': id_,
|
|
'error': None,
|
|
'result': result,
|
|
}
|
|
else:
|
|
response = {
|
|
'id': id_,
|
|
'error': {'code': err, 'message': result},
|
|
'result': None,
|
|
}
|
|
|
|
return web.json_response(response)
|
|
|
|
async def json_handler(self, request):
|
|
method = request.get('method')
|
|
id_ = request.get('id')
|
|
params = request.get('params', [])
|
|
handler = getattr(self.server, 'handle_rpc_{}'.format(method), None)
|
|
if not handler:
|
|
return 1, 'unknown method "{}"'.format(method)
|
|
else:
|
|
return await handler(params)
|
|
|
|
def tasks(self, port):
|
|
self.logger.info('listening on port {:d}'.format(port))
|
|
app = web.Application()
|
|
app.router.add_post('/', self.request_handler)
|
|
host = '0.0.0.0'
|
|
loop = app.loop
|
|
handler = app.make_handler()
|
|
server = loop.create_server(handler, host, port)
|
|
return [server, app.startup()]
|