diff options
author | Damien George <damien@micropython.org> | 2020-07-25 23:05:41 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2020-07-25 23:10:05 +1000 |
commit | 441460d81ff2b1faee7d044d859896f754361b93 (patch) | |
tree | 3c8b4205e9546dc6ddaa56f336e63a304e4e1218 /extmod/uasyncio | |
parent | fd2ff867a08fd174f0bbf7a03aa59547634e91ac (diff) |
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>
Diffstat (limited to 'extmod/uasyncio')
-rw-r--r-- | extmod/uasyncio/stream.py | 12 |
1 files changed, 12 insertions, 0 deletions
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: |