summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/asyncio/streams.py12
-rw-r--r--Lib/test/test_asyncio/test_streams.py28
-rw-r--r--Misc/NEWS.d/next/Library/2023-11-01-14-03-24.gh-issue-110894.7-wZxC.rst1
3 files changed, 41 insertions, 0 deletions
diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py
index bc84e53..f82b10c 100644
--- a/Lib/asyncio/streams.py
+++ b/Lib/asyncio/streams.py
@@ -245,7 +245,19 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
res = self._client_connected_cb(reader,
self._stream_writer)
if coroutines.iscoroutine(res):
+ def callback(task):
+ exc = task.exception()
+ if exc is not None:
+ self._loop.call_exception_handler({
+ 'message': 'Unhandled exception in client_connected_cb',
+ 'exception': exc,
+ 'transport': transport,
+ })
+ transport.close()
+
self._task = self._loop.create_task(res)
+ self._task.add_done_callback(callback)
+
self._strong_reader = None
def connection_lost(self, exc):
diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py
index 9c92e75..c477b6c 100644
--- a/Lib/test/test_asyncio/test_streams.py
+++ b/Lib/test/test_asyncio/test_streams.py
@@ -1096,6 +1096,34 @@ os.close(fd)
self.assertEqual(messages, [])
+ def test_unhandled_exceptions(self) -> None:
+ port = socket_helper.find_unused_port()
+
+ messages = []
+ self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
+
+ async def client():
+ rd, wr = await asyncio.open_connection('localhost', port)
+ wr.write(b'test msg')
+ await wr.drain()
+ wr.close()
+ await wr.wait_closed()
+
+ async def main():
+ async def handle_echo(reader, writer):
+ raise Exception('test')
+
+ server = await asyncio.start_server(
+ handle_echo, 'localhost', port)
+ await server.start_serving()
+ await client()
+ server.close()
+ await server.wait_closed()
+
+ self.loop.run_until_complete(main())
+
+ self.assertEqual(messages[0]['message'],
+ 'Unhandled exception in client_connected_cb')
if __name__ == '__main__':
diff --git a/Misc/NEWS.d/next/Library/2023-11-01-14-03-24.gh-issue-110894.7-wZxC.rst b/Misc/NEWS.d/next/Library/2023-11-01-14-03-24.gh-issue-110894.7-wZxC.rst
new file mode 100644
index 0000000..c59fe6b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-11-01-14-03-24.gh-issue-110894.7-wZxC.rst
@@ -0,0 +1 @@
+Call loop exception handler for exceptions in ``client_connected_cb`` of :func:`asyncio.start_server` so that applications can handle it. Patch by Kumar Aditya.