8000 Fix _SelectorSocketTransport constructor · python/asyncio@c560003 · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Commit c560003

Browse files
committed
Fix _SelectorSocketTransport constructor
Only start reading when connection_made() has been called: protocol.data_received() must not be called before protocol.connection_made().
1 parent aed248b commit c560003

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

asyncio/selector_events.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,10 @@ def __init__(self, loop, sock, protocol, waiter=None,
578578
self._eof = False
579579
self._paused = False
580580

581-
self._loop.add_reader(self._sock_fd, self._read_ready)
582581
self._loop.call_soon(self._protocol.connection_made, self)
582+
# only start reading when connection_made() has been called
583+
self._loop.call_soon(self._loop.add_reader,
584+
self._sock_fd, self._read_ready)
583585
if waiter is not None:
584586
# only wake up the waiter when connection_made() has been called
585587
self._loop.call_soon(waiter._set_result_unless_cancelled, None)

tests/test_selector_events.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def setUp(self):
5959
def test_make_socket_transport(self):
6060
m = mock.Mock()
6161
self.loop.add_reader = mock.Mock()
62+
self.loop.add_reader._is_coroutine = False
6263
transport = self.loop._make_socket_transport(m, asyncio.Protocol())
6364
self.assertIsInstance(transport, _SelectorSocketTransport)
6465
close_transport(transport)
@@ -67,6 +68,7 @@ def test_make_socket_transport(self):
6768
def test_make_ssl_transport(self):
6869
m = mock.Mock()
6970
self.loop.add_reader = mock.Mock()
71+
self.loop.add_reader._is_coroutine = False
7072
self.loop.add_writer = mock.Mock()
7173
self.loop.remove_reader = mock.Mock()
7274
self.loop.remove_writer = mock.Mock()
@@ -770,20 +772,24 @@ def socket_transport(self, waiter=None):
770772
return transport
771773

772774
def test_ctor(self):
773-
tr = self.socket_transport()
775+
waiter = asyncio.Future(loop=self.loop)
776+
tr = self.socket_transport(waiter=waiter)
777+
self.loop.run_until_complete(waiter)
778+
774779
self.loop.assert_reader(7, tr._read_ready)
775780
test_utils.run_briefly(self.loop)
776781
self.protocol.connection_made.assert_called_with(tr)
777782

778783
def test_ctor_with_waiter(self):
779-
fut = asyncio.Future(loop=self.loop)
784+
waiter = asyncio.Future(loop=self.loop)
785+
self.socket_transport(waiter=waiter)
786+
self.loop.run_until_complete(waiter)
780787

781-
self.socket_transport(waiter=fut)
782-
test_utils.run_briefly(self.loop)
783-
self.assertIsNone(fut.result())
788+
self.assertIsNone(waiter.result())
784789

785790
def test_pause_resume_reading(self):
786791
tr = self.socket_transport()
792+
test_utils.run_briefly(self.loop)
787793
self.assertFalse(tr._paused)
788794
self.loop.assert_reader(7, tr._read_ready)
789795
tr.pause_reading()

0 commit comments

Comments
 (0)
0