Fix Daphne ASGI compatibility and document WS handshake cookie limitation

- AsgiContext and AsgiWebSocket now default missing  scope key
  to 'http' / 'ws' respectively (Daphne omits it for websocket scopes)
- Add regression test for websocket scope without scheme
- Update example/session.py WS handler to read the session; cookie must
  be set via HTTP first because common ASGI servers ignore the headers
  field on websocket.accept
- Update README with the same caveat about Granian/Daphne/curl
This commit is contained in:
2026-07-23 22:11:06 +08:00
parent e4e00762bb
commit ca023580e4
4 changed files with 39 additions and 12 deletions
+6 -2
View File
@@ -35,7 +35,11 @@ async def echo(ws: WebSocket) -> None:
@app.websocket('/ws/visits')
async def ws_visits(ws: WebSocket) -> None:
visits = ws.session.get('visits', 0) + 1
ws.session['visits'] = visits
# WebSocket handlers can read the existing session. Most ASGI servers
# (including Granian and Daphne) do not forward the `headers` field of the
# `websocket.accept` message into the HTTP 101 response, so a new session
# cookie cannot be set during the handshake. Use the HTTP `/` endpoint to
# set or refresh the session cookie before connecting here.
await ws.accept()
visits = ws.session.get('visits', 0)
await ws.send_text(f'visits: {visits}')