Skip to content

Commit 7b1c368

Browse files
authored
Close connection on exit of server-side handler. (#53)
Fixes #50.
1 parent 50952be commit 7b1c368

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

tests/test_connection.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
import functools
1+
from functools import partial
22

33
import pytest
4-
import trio.hazmat
5-
import trio.ssl
6-
import trio.testing
4+
import trio
75
import trustme
86
from async_generator import async_generator, yield_
97
from trio_websocket import *
@@ -17,8 +15,7 @@
1715
async def echo_server(nursery):
1816
''' A server that reads one message, sends back the same message,
1917
then closes the connection. '''
20-
serve_fn = functools.partial(serve_websocket, echo_handler, HOST, 0,
21-
ssl_context=None)
18+
serve_fn = partial(serve_websocket, echo_handler, HOST, 0, ssl_context=None)
2219
server = await nursery.start(serve_fn)
2320
await yield_(server)
2421

@@ -123,7 +120,7 @@ async def test_serve_ssl(nursery):
123120
async def test_serve_handler_nursery(nursery):
124121
task = trio.hazmat.current_task()
125122
async with trio.open_nursery() as handler_nursery:
126-
serve_with_nursery = functools.partial(serve_websocket, echo_handler,
123+
serve_with_nursery = partial(serve_websocket, echo_handler,
127124
HOST, 0, None, handler_nursery=handler_nursery)
128125
server = await nursery.start(serve_with_nursery)
129126
port = server.port
@@ -241,7 +238,7 @@ async def handler(stream):
241238
msg = await server.get_message()
242239
assert msg == 'Hello from client!'
243240
assert server.is_closed
244-
serve_fn = functools.partial(trio.serve_tcp, handler, 0, host=HOST)
241+
serve_fn = partial(trio.serve_tcp, handler, 0, host=HOST)
245242
listeners = await nursery.start(serve_fn)
246243
port = listeners[0].socket.getsockname()[1]
247244
async with open_websocket(HOST, port, RESOURCE, use_ssl=False) as client:
@@ -269,9 +266,24 @@ async def handler(stream):
269266
await stream.aclose()
270267
with pytest.raises(ConnectionClosed):
271268
await server.send_message('Hello from client!')
272-
serve_fn = functools.partial(trio.serve_tcp, handler, 0, host=HOST)
269+
serve_fn = partial(trio.serve_tcp, handler, 0, host=HOST)
273270
listeners = await nursery.start(serve_fn)
274271
port = listeners[0].socket.getsockname()[1]
275272
async with open_websocket(HOST, port, RESOURCE, use_ssl=False) as client:
276273
with pytest.raises(ConnectionClosed):
277274
await client.get_message()
275+
276+
277+
async def test_server_handler_exit(nursery, autojump_clock):
278+
async def handler(connection):
279+
await trio.sleep(1)
280+
281+
server = await nursery.start(
282+
partial(serve_websocket, handler, HOST, 0, ssl_context=None))
283+
284+
# connection should close when server handler exists
285+
with trio.fail_after(2):
286+
async with open_websocket(
287+
HOST, server.port, '/', use_ssl=False) as connection:
288+
with pytest.raises(ConnectionClosed):
289+
await connection.get_message()

trio_websocket/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,5 +744,7 @@ async def _handle_connection(self, stream):
744744
wsproto = wsconnection.WSConnection(wsconnection.SERVER)
745745
connection = WebSocketConnection(stream, wsproto)
746746
nursery.start_soon(connection._reader_task)
747-
await connection._open_handshake.wait()
748-
nursery.start_soon(self._handler, connection)
747+
async with connection:
748+
await connection._open_handshake.wait()
749+
await self._handler(connection)
750+
nursery.cancel_scope.cancel()

0 commit comments

Comments
 (0)