Add websocket session support to kaya-session
- kaya-core: WebSocket ABC gains session attribute and accept(headers=...) - kaya-core: AsgiWebSocket injects headers into websocket.accept message - kaya-rsgi: RsgiWebSocket accepts headers param (ignored — Granian's accept() takes no args) - kaya-session: SessionWebSocket wrapper exposes ws.session and injects Set-Cookie on accept() - kaya-session: SessionMixin registers before/after websocket hooks; session loaded at connect, persisted on close if modified - 10 new WV session tests covering read, persist, handshake cookie, regenerate, invalidate, isolation - Example and README updated
This commit is contained in:
@@ -4,6 +4,7 @@ from pwo import async_test
|
||||
from httpx_ws import aconnect_ws, WebSocketDisconnect
|
||||
from httpx_ws.transport import ASGIWebSocketTransport
|
||||
from kaya.core import KayaApp, WebSocket
|
||||
from kaya.core._asgi import AsgiWebSocket
|
||||
|
||||
|
||||
class WebSocketTest(unittest.TestCase):
|
||||
@@ -78,3 +79,55 @@ class WebSocketTest(unittest.TestCase):
|
||||
async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
|
||||
async with aconnect_ws("/echo", client) as ws:
|
||||
pass
|
||||
|
||||
@async_test
|
||||
async def test_accept_with_headers(self):
|
||||
sent_messages = []
|
||||
|
||||
async def send(message):
|
||||
sent_messages.append(message)
|
||||
|
||||
async def receive():
|
||||
return {'type': 'websocket.connect'}
|
||||
|
||||
scope = {
|
||||
'type': 'websocket',
|
||||
'path': '/echo',
|
||||
'query_string': b'',
|
||||
'scheme': 'ws',
|
||||
'client': ('127.0.0.1', 12345),
|
||||
'server': ('127.0.0.1', 80),
|
||||
'headers': [],
|
||||
}
|
||||
ws = AsgiWebSocket(scope, receive, send)
|
||||
await ws.accept(headers={'Set-Cookie': 'sid=abc; Path=/', 'X-Custom': ('a', 'b')})
|
||||
self.assertEqual(1, len(sent_messages))
|
||||
message = sent_messages[0]
|
||||
self.assertEqual('websocket.accept', message['type'])
|
||||
self.assertIn((b'Set-Cookie', b'sid=abc; Path=/'), message['headers'])
|
||||
self.assertIn((b'X-Custom', b'a'), message['headers'])
|
||||
self.assertIn((b'X-Custom', b'b'), message['headers'])
|
||||
|
||||
@async_test
|
||||
async def test_accept_without_headers(self):
|
||||
sent_messages = []
|
||||
|
||||
async def send(message):
|
||||
sent_messages.append(message)
|
||||
|
||||
async def receive():
|
||||
return {'type': 'websocket.connect'}
|
||||
|
||||
scope = {
|
||||
'type': 'websocket',
|
||||
'path': '/echo',
|
||||
'query_string': b'',
|
||||
'scheme': 'ws',
|
||||
'client': ('127.0.0.1', 12345),
|
||||
'server': ('127.0.0.1', 80),
|
||||
'headers': [],
|
||||
}
|
||||
ws = AsgiWebSocket(scope, receive, send)
|
||||
await ws.accept()
|
||||
self.assertEqual(1, len(sent_messages))
|
||||
self.assertEqual({'type': 'websocket.accept'}, sent_messages[0])
|
||||
|
||||
Reference in New Issue
Block a user