From 330a5157f1c253e7f51edc737081a44612058de6 Mon Sep 17 00:00:00 2001 From: Eugene Oden Date: Sun, 21 Feb 2010 23:11:09 -0500 Subject: [PATCH] fixes for greenpipe - make readuntil() call self._recv() instead of self.fd.read() - make readline() terminate on '\n' as well as '\r\n' --- eventlet/greenio.py | 8 ++++---- tests/greenio_test.py | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/eventlet/greenio.py b/eventlet/greenio.py index 63e42ec..b95ab39 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -336,7 +336,7 @@ class GreenSocket(object): class GreenPipe(object): """ GreenPipe is a cooperatively-yielding wrapper around OS pipes. """ - newlines = '\r\n' + newlines = '\n' def __init__(self, fd): set_nonblocking(fd) self.fd = fd @@ -416,7 +416,7 @@ class GreenPipe(object): chunk, self.recvbuffer = buf[:found], buf[found:] return chunk checked = max(0, len(buf) - (len(terminator) - 1)) - d = self.read(BUFFER_SIZE) + d = self._recv(BUFFER_SIZE) if not d: break buf += d @@ -428,7 +428,7 @@ class GreenPipe(object): chunk, self.recvbuffer = buf[:found], buf[found:] return chunk checked = len(buf) - d = self.read(BUFFER_SIZE) + d = self._recv(BUFFER_SIZE) if not d: break buf += d @@ -574,4 +574,4 @@ def serve(sock, handle, concurrency=1000): connections until the existing ones complete. """ pass - \ No newline at end of file + diff --git a/tests/greenio_test.py b/tests/greenio_test.py index f956954..2cbaad4 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -259,7 +259,39 @@ class TestGreenIo(LimitedTestCase): self.assertEquals(result, 'sent via event') server.close() client.close() - + + def test_pipe_read(self): + # ensure that 'readline' works properly on GreenPipes when data is not + # immediately available (fd is nonblocking, was raising EAGAIN) + # also ensures that readline() terminates on '\n' and '\r\n' + r, w = os.pipe() + + r = os.fdopen(r) + w = os.fdopen(w, 'w') + + r = greenio.GreenPipe(r) + w = greenio.GreenPipe(w) + + def writer(): + eventlet.sleep(.1) + + w.write('line\n') + w.flush() + + w.write('line\r\n') + w.flush() + + gt = eventlet.spawn(writer) + + eventlet.sleep(0) + + line = r.readline() + self.assertEquals(line, 'line\n') + + line = r.readline() + self.assertEquals(line, 'line\r\n') + + gt.wait() class TestGreenIoLong(LimitedTestCase): TEST_TIMEOUT=10 # the test here might take a while depending on the OS