summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2013-10-15 13:08:03 -0700
committerGuido van Rossum <guido@python.org>2013-10-15 13:08:03 -0700
commit28f2ebcbb2c375b1b8a31a4d3cf57513a0e0f697 (patch)
tree8e426709e1c3154eda3bd0499f7d7e8596c5838a
parentb4efc4ed3aa7339ed76ba3f634bc79ee41422557 (diff)
parent53273cb40e66116a33f2802db4a9a9fb169031f3 (diff)
downloadtrollius-28f2ebcbb2c375b1b8a31a4d3cf57513a0e0f697.tar.gz
Merge eof_received() change.
-rw-r--r--asyncio/proactor_events.py5
-rw-r--r--asyncio/protocols.py8
-rw-r--r--asyncio/selector_events.py5
-rw-r--r--tests/test_base_events.py1
-rw-r--r--tests/test_events.py1
-rw-r--r--tests/test_selector_events.py12
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