Skip to content

[3.7] Revert "bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098)" #13328

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 8 additions & 13 deletions Lib/asyncio/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,9 +208,6 @@ async def _drain_helper(self):
self._drain_waiter = waiter
await waiter

def _get_close_waiter(self, stream):
raise NotImplementedError


class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
"""Helper class to adapt between Protocol and StreamReader.
Expand Down Expand Up @@ -268,9 +265,6 @@ def eof_received(self):
return False
return True

def _get_close_waiter(self, stream):
return self._closed

def __del__(self):
# Prevent reports about unhandled exceptions.
# Better than self._closed._log_traceback = False hack
Expand Down Expand Up @@ -326,7 +320,7 @@ def is_closing(self):
return self._transport.is_closing()

async def wait_closed(self):
await self._protocol._get_close_waiter(self)
await self._protocol._closed

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


Expand Down
9 changes: 0 additions & 9 deletions Lib/asyncio/subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ def __init__(self, limit, loop):
self._transport = None
self._process_exited = False
self._pipe_fds = []
self._stdin_closed = self._loop.create_future()

def __repr__(self):
info = [self.__class__.__name__]
Expand Down Expand Up @@ -77,10 +76,6 @@ def pipe_connection_lost(self, fd, exc):
if pipe is not None:
pipe.close()
self.connection_lost(exc)
if exc is None:
self._stdin_closed.set_result(None)
else:
self._stdin_closed.set_exception(exc)
return
if fd == 1:
reader = self.stdout
Expand All @@ -107,10 +102,6 @@ def _maybe_close_transport(self):
self._transport.close()
self._transport = None

def _get_close_waiter(self, stream):
if stream is self.stdin:
return self._stdin_closed


class Process:
def __init__(self, transport, protocol, loop):
Expand Down
23 changes: 0 additions & 23 deletions Lib/test/test_asyncio/test_streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,29 +99,6 @@ def test_open_unix_connection_no_loop_ssl(self):

self._basetest_open_connection_no_loop_ssl(conn_fut)

@unittest.skipIf(ssl is None, 'No ssl module')
def test_drain_on_closed_writer_ssl(self):

async def inner(httpd):
reader, writer = await asyncio.open_connection(
*httpd.address,
ssl=test_utils.dummy_ssl_context())

messages = []
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
writer.write(b'GET / HTTP/1.0\r\n\r\n')
data = await reader.read()
self.assertTrue(data.endswith(b'\r\n\r\nTest message'))

writer.close()
with self.assertRaises(ConnectionResetError):
await writer.drain()

self.assertEqual(messages, [])

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

def _basetest_open_connection_error(self, open_connection_fut):
reader, writer = self.loop.run_until_complete(open_connection_fut)
writer._protocol.connection_lost(ZeroDivisionError())
Expand Down

This file was deleted.