diff options
author | David Szotten <davidszotten@gmail.com> | 2015-07-22 14:03:35 +0200 |
---|---|---|
committer | Sergey Shepelev <temotor@gmail.com> | 2015-07-24 17:31:17 +0300 |
commit | 32305974e2c9d3f0a91e61ba0395a02def2ba8df (patch) | |
tree | 8ad00ccf4d0fc6556de7c0585c595e67894d0a8c | |
parent | e9f19c6df4a6e97a36a974338196a5a0bda079e4 (diff) | |
download | eventlet-32305974e2c9d3f0a91e61ba0395a02def2ba8df.tar.gz |
support buflen=-1 and readall like FileIO doesdavidszotten-greenfileio_readall
required to make pytest work with an active eventlet.monkey_patch() on py3
https://github.com/eventlet/eventlet/pull/239
-rw-r--r-- | eventlet/greenio/py3.py | 20 | ||||
-rw-r--r-- | tests/greenio_test.py | 15 |
2 files changed, 33 insertions, 2 deletions
diff --git a/eventlet/greenio/py3.py b/eventlet/greenio/py3.py index 338ac68..57b72ea 100644 --- a/eventlet/greenio/py3.py +++ b/eventlet/greenio/py3.py @@ -75,10 +75,26 @@ class GreenFileIO(_OriginalIOBase): def fileno(self): return self._fileno - def read(self, buflen): + def read(self, size=-1): + if size == -1: + return self.readall() + + while True: + try: + return _original_os.read(self._fileno, size) + except OSError as e: + if get_errno(e) not in SOCKET_BLOCKING: + raise IOError(*e.args) + self._trampoline(self, read=True) + + def readall(self): + buf = [] while True: try: - return _original_os.read(self._fileno, buflen) + chunk = _original_os.read(self._fileno, DEFAULT_BUFFER_SIZE) + if chunk == b'': + return b''.join(buf) + buf.append(chunk) except OSError as e: if get_errno(e) not in SOCKET_BLOCKING: raise IOError(*e.args) diff --git a/tests/greenio_test.py b/tests/greenio_test.py index 8a94b7b..34ef905 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -3,6 +3,7 @@ import errno import eventlet import fcntl import gc +from io import DEFAULT_BUFFER_SIZE import os import shutil import socket as _orig_sock @@ -711,6 +712,20 @@ class TestGreenPipe(tests.LimitedTestCase): gt.wait() + def test_pip_read_until_end(self): + # similar to test_pip_read above but reading until eof + r, w = os.pipe() + + r = greenio.GreenPipe(r, 'rb') + w = greenio.GreenPipe(w, 'wb') + + w.write(b'c' * DEFAULT_BUFFER_SIZE * 2) + w.close() + + buf = r.read() # no chunk size specified; read until end + self.assertEqual(len(buf), 2 * DEFAULT_BUFFER_SIZE) + self.assertEqual(buf[:3], b'ccc') + def test_pipe_writes_large_messages(self): r, w = os.pipe() |