Browse Source

Catch exceptions when trying to listen

Fixes #11
master
Neil Booth 8 years ago
parent
commit
8188f7e909
  1. 39
      server/protocol.py

39
server/protocol.py

@ -47,41 +47,42 @@ class BlockServer(BlockProcessor):
await self.start_servers() await self.start_servers()
ElectrumX.notify(self.height, self.touched) ElectrumX.notify(self.height, self.touched)
async def start_server(self, name, protocol, host, port, *, ssl=None):
loop = asyncio.get_event_loop()
server = loop.create_server(protocol, host, port, ssl=ssl)
try:
self.servers.append(await server)
except asyncio.CancelledError:
raise
except Exception as e:
self.logger.error('{} server failed to listen on {}:{:d} :{}'
.format(name, host, port, e))
else:
self.logger.info('{} server listening on {}:{:d}'
.format(name, host, port))
async def start_servers(self): async def start_servers(self):
'''Start listening on RPC, TCP and SSL ports. '''Start listening on RPC, TCP and SSL ports.
Does not start a server if the port wasn't specified. Does not start a server if the port wasn't specified.
''' '''
env = self.env env = self.env
loop = asyncio.get_event_loop()
JSONRPC.init(self, self.daemon, self.coin) JSONRPC.init(self, self.daemon, self.coin)
protocol = LocalRPC protocol = LocalRPC
if env.rpc_port is not None: if env.rpc_port is not None:
host = 'localhost' await self.start_server('RPC', protocol, 'localhost', env.rpc_port)
rpc_server = loop.create_server(protocol, host, env.rpc_port)
self.servers.append(await rpc_server)
self.logger.info('RPC server listening on {}:{:d}'
.format(host, env.rpc_port))
protocol = partial(ElectrumX, env) protocol = partial(ElectrumX, env)
if env.tcp_port is not None: if env.tcp_port is not None:
tcp_server = loop.create_server(protocol, env.host, env.tcp_port) await self.start_server('TCP', protocol, env.host, env.tcp_port)
self.servers.append(await tcp_server)
self.logger.info('TCP server listening on {}:{:d}'
.format(env.host, env.tcp_port))
if env.ssl_port is not None: if env.ssl_port is not None:
# FIXME: update if we want to require Python >= 3.5.3 # FIXME: update if we want to require Python >= 3.5.3
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) sslc = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
ssl_context.load_cert_chain(env.ssl_certfile, sslc.load_cert_chain(env.ssl_certfile, keyfile=env.ssl_keyfile)
keyfile=env.ssl_keyfile) await self.start_server('SSL', protocol, env.host, env.ssl_port,
ssl_server = loop.create_server(protocol, env.host, env.ssl_port, ssl=sslc)
ssl=ssl_context)
self.servers.append(await ssl_server)
self.logger.info('SSL server listening on {}:{:d}'
.format(env.host, env.ssl_port))
def stop(self): def stop(self):
'''Close the listening servers.''' '''Close the listening servers.'''

Loading…
Cancel
Save