uasyncio: StreamReader.readline: Handle partial reads.

Now it will return a complete line regardless if it may take several
partial reads to do that. Test included.
pull/149/head
Paul Sokolovsky 2017-01-27 01:09:19 +03:00
rodzic a8d85e28d0
commit ec7b4b948b
2 zmienionych plików z 39 dodań i 8 usunięć

Wyświetl plik

@ -0,0 +1,30 @@
from uasyncio import StreamReader
class MockSock:
def __init__(self, data_list):
self.data = data_list
def readline(self):
try:
return self.data.pop(0)
except IndexError:
return b""
mock = MockSock([
b"line1\n",
b"parts ", b"of ", b"line2\n",
b"unterminated",
])
def func():
sr = StreamReader(mock)
assert await sr.readline() == b"line1\n"
assert await sr.readline() == b"parts of line2\n"
assert await sr.readline() == b"unterminated"
assert await sr.readline() == b""
for i in func():
pass

Wyświetl plik

@ -92,19 +92,20 @@ class StreamReader:
def readline(self):
if __debug__:
log.debug("StreamReader.readline()")
# if DEBUG and __debug__:
# log.debug("StreamReader.readline(): after IORead: %s", s)
buf = b""
while True:
yield IORead(self.s)
res = self.s.readline()
if res is not None:
break
log.warn("Empty read")
assert res is not None
if not res:
yield IOReadDone(self.s)
break
buf += res
if buf[-1] == 0x0a:
break
if DEBUG and __debug__:
log.debug("StreamReader.readline(): res: %s", res)
return res
log.debug("StreamReader.readline(): %s", buf)
return buf
def aclose(self):
yield IOReadDone(self.s)