extmod/uasyncio: Add StreamReader.readexactly(n) method.

It raises on EOFError instead of an IncompleteReadError (which is what
CPython does).  But the latter is derived from EOFError so code compatible
with MicroPython and CPython can be written by catching EOFError (eg see
included test).

Fixes issue #6156.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George
2020-07-25 23:05:41 +10:00
parent fd2ff867a0
commit 441460d81f
3 changed files with 90 additions and 0 deletions

View File

@@ -30,6 +30,18 @@ class Stream:
yield core._io_queue.queue_read(self.s)
return self.s.read(n)
async def readexactly(self, n):
r = b""
while n:
yield core._io_queue.queue_read(self.s)
r2 = self.s.read(n)
if r2 is not None:
if not len(r2):
raise EOFError
r += r2
n -= len(r2)
return r
async def readline(self):
l = b""
while True: