diff options
author | Guido van Rossum <guido@python.org> | 2013-10-15 13:08:03 -0700 |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2013-10-15 13:08:03 -0700 |
commit | 28f2ebcbb2c375b1b8a31a4d3cf57513a0e0f697 (patch) | |
tree | 8e426709e1c3154eda3bd0499f7d7e8596c5838a | |
parent | b4efc4ed3aa7339ed76ba3f634bc79ee41422557 (diff) | |
parent | 53273cb40e66116a33f2802db4a9a9fb169031f3 (diff) | |
download | trollius-28f2ebcbb2c375b1b8a31a4d3cf57513a0e0f697.tar.gz |
Merge eof_received() change.
-rw-r--r-- | asyncio/proactor_events.py | 5 | ||||
-rw-r--r-- | asyncio/protocols.py | 8 | ||||
-rw-r--r-- | asyncio/selector_events.py | 5 | ||||
-rw-r--r-- | tests/test_base_events.py | 1 | ||||
-rw-r--r-- | tests/test_events.py | 1 | ||||
-rw-r--r-- | tests/test_selector_events.py | 12 |
6 files changed, 19 insertions, 13 deletions
diff --git a/asyncio/proactor_events.py b/asyncio/proactor_events.py index e27882e..348de03 100644 --- a/asyncio/proactor_events.py +++ b/asyncio/proactor_events.py @@ -145,9 +145,8 @@ class _ProactorReadPipeTransport(_ProactorBasePipeTransport, if data: self._protocol.data_received(data) elif data is not None: - try: - self._protocol.eof_received() - finally: + keep_open = self._protocol.eof_received() + if not keep_open: self.close() diff --git a/asyncio/protocols.py b/asyncio/protocols.py index d76f25a..a94abbe 100644 --- a/asyncio/protocols.py +++ b/asyncio/protocols.py @@ -60,11 +60,9 @@ class Protocol(BaseProtocol): def eof_received(self): """Called when the other end calls write_eof() or equivalent. - The default implementation does nothing. - - TODO: By default close the transport. But we don't have the - transport as an instance variable (connection_made() may not - set it). + If this returns a false value (including None), the transport + will close itself. If it returns a true value, closing the + transport is up to the protocol. """ diff --git a/asyncio/selector_events.py b/asyncio/selector_events.py index 84963eb..98a8f20 100644 --- a/asyncio/selector_events.py +++ b/asyncio/selector_events.py @@ -432,9 +432,8 @@ class _SelectorSocketTransport(_SelectorTransport): if data: self._protocol.data_received(data) else: - try: - self._protocol.eof_received() - finally: + keep_open = self._protocol.eof_received() + if not keep_open: self.close() def write(self, data): diff --git a/tests/test_base_events.py b/tests/test_base_events.py index 5393bd4..e2f1272 100644 --- a/tests/test_base_events.py +++ b/tests/test_base_events.py @@ -256,7 +256,6 @@ class MyProto(protocols.Protocol): def eof_received(self): assert self.state == 'CONNECTED', self.state self.state = 'EOF' - self.transport.close() def connection_lost(self, exc): assert self.state in ('CONNECTED', 'EOF'), self.state diff --git a/tests/test_events.py b/tests/test_events.py index 7b12700..3ba984f 100644 --- a/tests/test_events.py +++ b/tests/test_events.py @@ -110,7 +110,6 @@ class MyReadPipeProto(protocols.Protocol): def eof_received(self): assert self.state == ['INITIAL', 'CONNECTED'], self.state self.state.append('EOF') - self.transport.close() def connection_lost(self, exc): assert self.state == ['INITIAL', 'CONNECTED', 'EOF'], self.state diff --git a/tests/test_selector_events.py b/tests/test_selector_events.py index 1cd34dd..0225e13 100644 --- a/tests/test_selector_events.py +++ b/tests/test_selector_events.py @@ -708,6 +708,18 @@ class SelectorSocketTransportTests(unittest.TestCase): self.protocol.eof_received.assert_called_with() transport.close.assert_called_with() + def test_read_ready_eof_keep_open(self): + transport = _SelectorSocketTransport( + self.loop, self.sock, self.protocol) + transport.close = unittest.mock.Mock() + + self.sock.recv.return_value = b'' + self.protocol.eof_received.return_value = True + transport._read_ready() + + self.protocol.eof_received.assert_called_with() + self.assertFalse(transport.close.called) + @unittest.mock.patch('logging.exception') def test_read_ready_tryagain(self, m_exc): self.sock.recv.side_effect = BlockingIOError |