From 441460d81ff2b1faee7d044d859896f754361b93 Mon Sep 17 00:00:00 2001 From: Damien George Date: Sat, 25 Jul 2020 23:05:41 +1000 Subject: 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 --- extmod/uasyncio/stream.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'extmod') diff --git a/extmod/uasyncio/stream.py b/extmod/uasyncio/stream.py index 2a1efd1a1..b6d787e4f 100644 --- a/extmod/uasyncio/stream.py +++ b/extmod/uasyncio/stream.py @@ -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: -- cgit v1.2.3