summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Szotten <davidszotten@gmail.com>2015-07-22 14:03:35 +0200
committerSergey Shepelev <temotor@gmail.com>2015-07-24 17:31:17 +0300
commit32305974e2c9d3f0a91e61ba0395a02def2ba8df (patch)
tree8ad00ccf4d0fc6556de7c0585c595e67894d0a8c
parente9f19c6df4a6e97a36a974338196a5a0bda079e4 (diff)
downloadeventlet-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.py20
-rw-r--r--tests/greenio_test.py15
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()