diff options
author | Damien George <damien@micropython.org> | 2021-06-25 16:53:20 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2021-06-26 22:30:22 +1000 |
commit | 7ec95c2768793c28351d13a9c471991bb2d6dcff (patch) | |
tree | cc65bc817cca1c6c9455316c1a588068d26e5b4b /tests/net_hosted/uasyncio_start_server.py | |
parent | cbc9a591a437177ac978302c16b56dd6cb46104f (diff) | |
download | micropython-7ec95c2768793c28351d13a9c471991bb2d6dcff.tar.gz micropython-7ec95c2768793c28351d13a9c471991bb2d6dcff.zip |
extmod/uasyncio: Get addr and bind server socket before creating task.
Currently when using uasyncio.start_server() the socket configuration is
done inside a uasyncio.create_task() background function. If the address
and port are already in use however this throws an OSError which cannot be
cleanly caught behind the create_task().
This commit moves the getaddrinfo and socket binding to the start_server()
function, and only creates the task if that succeeds. This means that any
OSError from the initial socket configuration is propagated directly up the
call stack, compatible with CPython behaviour.
See #7444.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'tests/net_hosted/uasyncio_start_server.py')
-rw-r--r-- | tests/net_hosted/uasyncio_start_server.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/net_hosted/uasyncio_start_server.py b/tests/net_hosted/uasyncio_start_server.py new file mode 100644 index 0000000000..f13402979f --- /dev/null +++ b/tests/net_hosted/uasyncio_start_server.py @@ -0,0 +1,31 @@ +# Test basic behaviour of uasyncio.start_server() + +try: + import uasyncio as asyncio +except ImportError: + try: + import asyncio + except ImportError: + print("SKIP") + raise SystemExit + + +async def test(): + # Test creating 2 servers using the same address + print("create server1") + server1 = await asyncio.start_server(None, "0.0.0.0", 8000) + try: + print("create server2") + await asyncio.start_server(None, "0.0.0.0", 8000) + except OSError as er: + print("OSError") + + # Wait for server to close. + async with server1: + print("sleep") + await asyncio.sleep(0) + + print("done") + + +asyncio.run(test()) |