cleanup SSL handling

This commit is contained in:
2021-06-20 13:15:31 -04:00
parent e00e0928bb
commit 3fc70da932
+19 -13
View File
@@ -847,7 +847,7 @@ async def ws_serve(websocket, path):
ws_connections[websocket] = path ws_connections[websocket] = path
remote_address = websocket.remote_address remote_address = websocket.remote_address
if verbose: print(f"DBG ws_serve: {remote_address}") if verbose: print(f"DBG ws_serve: {remote_address}: {path}")
while True: while True:
try: try:
name = await websocket.recv() name = await websocket.recv()
@@ -866,10 +866,11 @@ async def ws_serve(websocket, path):
await websocket.send(jmsg) await websocket.send(jmsg)
if verbose: print(f"DBG ws_serve: close {remote_address}") if verbose: print(f"DBG ws_serve: close {remote_address}")
try: await websocket.wait_closed()
del ws_connections[websocket] # try:
except Exception as e: # del ws_connections[websocket]
print(f"warning: failed to delete websocket: {e}") # except Exception as e:
# print(f"warning: failed to delete websocket: {e}")
def websocketupdater(): def websocketupdater():
loop.run_forever() loop.run_forever()
@@ -879,14 +880,18 @@ def msg_to_websockets(typ: str, msg: str):
jmsg = json.dumps({'type': typ, 'data': msg}) jmsg = json.dumps({'type': typ, 'data': msg})
to_close = [] to_close = []
for ws in ws_connections: for ws in ws_connections:
if ws.closed:
to_close.append(ws)
continue
try: try:
asyncio.run(ws.send(jmsg)) asyncio.run_coroutine_threadsafe(ws.send(jmsg), loop)
except Exception: except Exception:
to_close.append(ws) to_close.append(ws)
print("ws.send exception: closed") print("ws.send exception: closed")
for ws in to_close: for ws in to_close:
ws.close() asyncio.run_coroutine_threadsafe(ws.wait_closed(), loop)
if ws in ws_connections:
del ws_connections[ws] del ws_connections[ws]
# #
# Main # Main
@@ -1119,19 +1124,20 @@ except:
print(("failed to start server on %s:%s" % (hbd_host, hbd_port))) print(("failed to start server on %s:%s" % (hbd_host, hbd_port)))
sys.exit(1) sys.exit(1)
#
loop = asyncio.get_event_loop() loop=asyncio.new_event_loop()
asyncio.set_event_loop(loop)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
wss_pem = pathlib.Path(WSS_PEM) wss_pem = pathlib.Path(WSS_PEM)
wss_key = pathlib.Path(WSS_KEY) wss_key = pathlib.Path(WSS_KEY)
ssl_context.load_cert_chain(wss_pem, keyfile=wss_key) ssl_context.load_cert_chain(wss_pem, keyfile=wss_key)
wss_start_server = websockets.serve(ws_serve, hbd_host, WSSPORT, ssl=ssl_context) wss_start_server = websockets.serve(ws_serve, hbd_host, WSSPORT,
ssl=ssl_context, loop=loop, subprotocols="hbd")
loop.run_until_complete(wss_start_server) loop.run_until_complete(wss_start_server)
ws_start_server = websockets.serve(ws_serve, hbd_host, WSPORT, loop = loop) ws_start_server = websockets.serve(ws_serve, hbd_host, WSPORT,
loop = loop, subprotocols="hbd")
loop.run_until_complete(ws_start_server) loop.run_until_complete(ws_start_server)
servthread = threading.Thread(target=serv.serve_forever) servthread = threading.Thread(target=serv.serve_forever)