diff --git a/tests/test_connection.py b/tests/test_connection.py index 2a6da83..1a9c1f2 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -732,6 +732,27 @@ async def handler(request): await client_ws.send_message('Hello from client!') +async def test_server_sends_after_close(nursery): + done = trio.Event() + + async def handler(request): + server_ws = await request.accept() + with pytest.raises(ConnectionClosed): + while True: + await server_ws.send_message('Hello from server') + done.set() + + server = await nursery.start(serve_websocket, handler, HOST, 0, None) + stream = await trio.open_tcp_stream(HOST, server.port) + client_ws = await wrap_client_stream(nursery, stream, HOST, RESOURCE) + async with client_ws: + # pump a few messages + for x in range(2): + await client_ws.send_message('Hello from client') + await stream.aclose() + await done.wait() + + async def test_server_does_not_close_handshake(nursery): async def handler(stream): request = await wrap_server_stream(nursery, stream) diff --git a/trio_websocket/_impl.py b/trio_websocket/_impl.py index 53b5ae4..bd63b3c 100644 --- a/trio_websocket/_impl.py +++ b/trio_websocket/_impl.py @@ -1069,7 +1069,7 @@ async def _handle_message_event(self, event): self._message_parts = [] try: await self._send_channel.send(msg) - except trio.BrokenResourceError: + except (trio.ClosedResourceError, trio.BrokenResourceError): # The receive channel is closed, probably because somebody # called ``aclose()``. We don't want to abort the reader task, # and there's no useful cleanup that we can do here.