Skip to content

Commit c647ad9

Browse files
authored
Revert "bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098)" (GH-13328)
This reverts commit 93aa57a.
1 parent 2fef5b0 commit c647ad9

File tree

4 files changed

+8
-46
lines changed

4 files changed

+8
-46
lines changed

Lib/asyncio/streams.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,6 @@ async def _drain_helper(self):
208208
self._drain_waiter = waiter
209209
await waiter
210210

211-
def _get_close_waiter(self, stream):
212-
raise NotImplementedError
213-
214211

215212
class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
216213
"""Helper class to adapt between Protocol and StreamReader.
@@ -268,9 +265,6 @@ def eof_received(self):
268265
return False
269266
return True
270267

271-
def _get_close_waiter(self, stream):
272-
return self._closed
273-
274268
def __del__(self):
275269
# Prevent reports about unhandled exceptions.
276270
# Better than self._closed._log_traceback = False hack
@@ -326,7 +320,7 @@ def is_closing(self):
326320
return self._transport.is_closing()
327321

328322
async def wait_closed(self):
329-
await self._protocol._get_close_waiter(self)
323+
await self._protocol._closed
330324

331325
def get_extra_info(self, name, default=None):
332326
return self._transport.get_extra_info(name, default)
@@ -344,12 +338,13 @@ async def drain(self):
344338
if exc is not None:
345339
raise exc
346340
if self._transport.is_closing():
347-
# Wait for protocol.connection_lost() call
348-
# Raise connection closing error if any,
349-
# ConnectionResetError otherwise
350-
fut = self._protocol._get_close_waiter(self)
351-
await fut
352-
raise ConnectionResetError('Connection lost')
341+
# Yield to the event loop so connection_lost() may be
342+
# called. Without this, _drain_helper() would return
343+
# immediately, and code that calls
344+
# write(...); await drain()
345+
# in a loop would never call connection_lost(), so it
346+
# would not see an error when the socket is closed.
347+
await sleep(0, loop=self._loop)
353348
await self._protocol._drain_helper()
354349

355350

Lib/asyncio/subprocess.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ def __init__(self, limit, loop):
2525
self._transport = None
2626
self._process_exited = False
2727
self._pipe_fds = []
28-
self._stdin_closed = self._loop.create_future()
2928

3029
def __repr__(self):
3130
info = [self.__class__.__name__]
@@ -77,10 +76,6 @@ def pipe_connection_lost(self, fd, exc):
7776
if pipe is not None:
7877
pipe.close()
7978
self.connection_lost(exc)
80-
if exc is None:
81-
self._stdin_closed.set_result(None)
82-
else:
83-
self._stdin_closed.set_exception(exc)
8479
return
8580
if fd == 1:
8681
reader = self.stdout
@@ -107,10 +102,6 @@ def _maybe_close_transport(self):
107102
self._transport.close()
108103
self._transport = None
109104

110-
def _get_close_waiter(self, stream):
111-
if stream is self.stdin:
112-
return self._stdin_closed
113-
114105

115106
class Process:
116107
def __init__(self, transport, protocol, loop):

Lib/test/test_asyncio/test_streams.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -99,29 +99,6 @@ def test_open_unix_connection_no_loop_ssl(self):
9999

100100
self._basetest_open_connection_no_loop_ssl(conn_fut)
101101

102-
@unittest.skipIf(ssl is None, 'No ssl module')
103-
def test_drain_on_closed_writer_ssl(self):
104-
105-
async def inner(httpd):
106-
reader, writer = await asyncio.open_connection(
107-
*httpd.address,
108-
ssl=test_utils.dummy_ssl_context())
109-
110-
messages = []
111-
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
112-
writer.write(b'GET / HTTP/1.0\r\n\r\n')
113-
data = await reader.read()
114-
self.assertTrue(data.endswith(b'\r\n\r\nTest message'))
115-
116-
writer.close()
117-
with self.assertRaises(ConnectionResetError):
118-
await writer.drain()
119-
120-
self.assertEqual(messages, [])
121-
122-
with test_utils.run_test_server(use_ssl=True) as httpd:
123-
self.loop.run_until_complete(inner(httpd))
124-
125102
def _basetest_open_connection_error(self, open_connection_fut):
126103
reader, writer = self.loop.run_until_complete(open_connection_fut)
127104
writer._protocol.connection_lost(ZeroDivisionError())

Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)