Skip to content

Commit

Permalink
pythonGH-106684: raise ResourceWarning when asyncio.StreamWriter
Browse files Browse the repository at this point in the history
…is not closed (python#107650)
  • Loading branch information
kumaraditya303 authored and evildmp committed Aug 5, 2023
1 parent a67d2a8 commit d999392
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Lib/asyncio/streams.py
Expand Up @@ -5,6 +5,7 @@
import collections
import socket
import sys
import warnings
import weakref

if hasattr(socket, 'AF_UNIX'):
Expand Down Expand Up @@ -392,6 +393,11 @@ async def start_tls(self, sslcontext, *,
self._transport = new_transport
protocol._replace_writer(self)

def __del__(self, warnings=warnings):
if not self._transport.is_closing():
self.close()
warnings.warn(f"unclosed {self!r}", ResourceWarning)


class StreamReader:

Expand Down
23 changes: 23 additions & 0 deletions Lib/test/test_asyncio/test_streams.py
Expand Up @@ -1074,6 +1074,29 @@ def test_eof_feed_when_closing_writer(self):

self.assertEqual(messages, [])

def test_unclosed_resource_warnings(self):
async def inner(httpd):
rd, wr = await asyncio.open_connection(*httpd.address)

wr.write(b'GET / HTTP/1.0\r\n\r\n')
data = await rd.readline()
self.assertEqual(data, b'HTTP/1.0 200 OK\r\n')
data = await rd.read()
self.assertTrue(data.endswith(b'\r\n\r\nTest message'))
with self.assertWarns(ResourceWarning):
del wr
gc.collect()


messages = []
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))

with test_utils.run_test_server() as httpd:
self.loop.run_until_complete(inner(httpd))

self.assertEqual(messages, [])



if __name__ == '__main__':
unittest.main()
@@ -0,0 +1 @@
Raise :exc:`ResourceWarning` when :class:`asyncio.StreamWriter` is not closed leading to memory leaks. Patch by Kumar Aditya.

0 comments on commit d999392

Please sign in to comment.