server: better error handling for connection closing

This commit is contained in:
2026-07-30 14:41:52 +02:00
parent 5cd636d340
commit 384ba26170
+20 -1
View File
@@ -2,6 +2,7 @@
import asyncio import asyncio
import json, random, re, math, time, traceback import json, random, re, math, time, traceback
from websockets.exceptions import ConnectionClosed, ConnectionClosedOK
from websockets.asyncio.server import serve from websockets.asyncio.server import serve
from db import Database from db import Database
@@ -48,6 +49,12 @@ def serverError(msg,**kwargs) -> str:
sessionUsers = {} sessionUsers = {}
sessionCreatedAccount = [] sessionCreatedAccount = []
def forgetSession(sid):
if sid in sessionUsers:
del sessionUsers[sid]
if sid in sessionCreatedAccount:
sessionCreatedAccount.remove(sid)
async def handleCommand(ws,cmd): async def handleCommand(ws,cmd):
global sessionUsers global sessionUsers
print(f"recieved command: {cmd} (from {id(ws)})") print(f"recieved command: {cmd} (from {id(ws)})")
@@ -59,6 +66,8 @@ async def handleCommand(ws,cmd):
match cmd["type"]: match cmd["type"]:
case "ping": case "ping":
return await ws.send(response("Pong!")) return await ws.send(response("Pong!"))
# accounts
case "createuser": case "createuser":
if uid != None: if uid != None:
return await ws.send(clientError("You are already logged in.")) return await ws.send(clientError("You are already logged in."))
@@ -163,9 +172,19 @@ async def serveClient(ws):
except Exception as e: except Exception as e:
traceback.print_exception(e) traceback.print_exception(e)
await ws.send(serverError(f"Cannot process command ({cmd["type"]})")) await ws.send(serverError(f"Cannot process command ({cmd["type"]})"))
except json.decoder.JSONDecodeError:
await ws.send(serverError("Cannot process JSON."))
except ConnectionClosedOK:
print(f"connection {id(ws)} has closed")
forgetSession(id(ws))
break
except ConnectionClosed as e:
print(f"connection {id(ws)} has closed with a non-OK exit code:")
traceback.print_exception(e)
break
except Exception as e: except Exception as e:
traceback.print_exception(e) traceback.print_exception(e)
await ws.send(serverError("Cannot process JSON.")) await ws.send(serverError("Cannot parse command."))
async def main(): async def main():
async with serve(serveClient, "", 30341) as server: async with serve(serveClient, "", 30341) as server: