Skip to content

Commit 7ddcd0c

Browse files
authored
bpo-38529: Fix asyncio stream warning (GH-17474)
1 parent dec3672 commit 7ddcd0c

File tree

3 files changed

+3
-71
lines changed

3 files changed

+3
-71
lines changed

Lib/asyncio/streams.py

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
214214
def __init__(self, stream_reader, client_connected_cb=None, loop=None):
215215
super().__init__(loop=loop)
216216
if stream_reader is not None:
217-
self._stream_reader_wr = weakref.ref(stream_reader,
218-
self._on_reader_gc)
217+
self._stream_reader_wr = weakref.ref(stream_reader)
219218
self._source_traceback = stream_reader._source_traceback
220219
else:
221220
self._stream_reader_wr = None
@@ -231,22 +230,6 @@ def __init__(self, stream_reader, client_connected_cb=None, loop=None):
231230
self._over_ssl = False
232231
self._closed = self._loop.create_future()
233232

234-
def _on_reader_gc(self, wr):
235-
transport = self._transport
236-
if transport is not None:
237-
# connection_made was called
238-
context = {
239-
'message': ('An open stream object is being garbage '
240-
'collected; call "stream.close()" explicitly.')
241-
}
242-
if self._source_traceback:
243-
context['source_traceback'] = self._source_traceback
244-
self._loop.call_exception_handler(context)
245-
transport.abort()
246-
else:
247-
self._reject_connection = True
248-
self._stream_reader_wr = None
249-
250233
@property
251234
def _stream_reader(self):
252235
if self._stream_reader_wr is None:

Lib/test/test_asyncio/test_streams.py

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -924,59 +924,6 @@ def test_wait_closed_on_close_with_unread_data(self):
924924
wr.close()
925925
self.loop.run_until_complete(wr.wait_closed())
926926

927-
def test_del_stream_before_sock_closing(self):
928-
messages = []
929-
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
930-
931-
with test_utils.run_test_server() as httpd:
932-
with self.assertWarns(DeprecationWarning):
933-
rd, wr = self.loop.run_until_complete(
934-
asyncio.open_connection(*httpd.address, loop=self.loop))
935-
sock = wr.get_extra_info('socket')
936-
self.assertNotEqual(sock.fileno(), -1)
937-
938-
wr.write(b'GET / HTTP/1.0\r\n\r\n')
939-
f = rd.readline()
940-
data = self.loop.run_until_complete(f)
941-
self.assertEqual(data, b'HTTP/1.0 200 OK\r\n')
942-
943-
# drop refs to reader/writer
944-
del rd
945-
del wr
946-
gc.collect()
947-
# make a chance to close the socket
948-
test_utils.run_briefly(self.loop)
949-
950-
self.assertEqual(1, len(messages))
951-
self.assertEqual(sock.fileno(), -1)
952-
953-
self.assertEqual(1, len(messages))
954-
self.assertEqual('An open stream object is being garbage '
955-
'collected; call "stream.close()" explicitly.',
956-
messages[0]['message'])
957-
958-
def test_del_stream_before_connection_made(self):
959-
messages = []
960-
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
961-
962-
with test_utils.run_test_server() as httpd:
963-
rd = asyncio.StreamReader(loop=self.loop)
964-
pr = asyncio.StreamReaderProtocol(rd, loop=self.loop)
965-
del rd
966-
gc.collect()
967-
tr, _ = self.loop.run_until_complete(
968-
self.loop.create_connection(
969-
lambda: pr, *httpd.address))
970-
971-
sock = tr.get_extra_info('socket')
972-
self.assertEqual(sock.fileno(), -1)
973-
974-
self.assertEqual(1, len(messages))
975-
self.assertEqual('An open stream was garbage collected prior to '
976-
'establishing network connection; '
977-
'call "stream.close()" explicitly.',
978-
messages[0]['message'])
979-
980927
def test_async_writer_api(self):
981928
async def inner(httpd):
982929
rd, wr = await asyncio.open_connection(*httpd.address)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Drop too noisy asyncio warning about deletion of a stream without explicit
2+
``.close()`` call.

0 commit comments

Comments
 (0)