Skip to content

Commit

Permalink
call call_exception_handler for exceptions in client_connected_cb
Browse files Browse the repository at this point in the history
  • Loading branch information
kumaraditya303 committed Nov 1, 2023
1 parent 5697fc2 commit 1e53d99
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
12 changes: 12 additions & 0 deletions Lib/asyncio/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,19 @@ def connection_made(self, transport):
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):
Expand Down
28 changes: 28 additions & 0 deletions Lib/test/test_asyncio/test_streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,34 @@ async def inner(httpd):

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__':
Expand Down

0 comments on commit 1e53d99

Please sign in to comment.