diff options
author | John Snow <jsnow@redhat.com> | 2021-09-15 12:29:40 -0400 |
---|---|---|
committer | John Snow <jsnow@redhat.com> | 2021-09-27 12:10:29 -0400 |
commit | 762bd4d7a745b3b19c4ffd3eaf4714a6961c4a11 (patch) | |
tree | 919e67bb0a35651837f7a763090301c984cb783a /python | |
parent | 12c7a57f5be577b6bb28c8526122cc51ad40a12b (diff) | |
download | qemu-762bd4d7a745b3b19c4ffd3eaf4714a6961c4a11.zip qemu-762bd4d7a745b3b19c4ffd3eaf4714a6961c4a11.tar.gz qemu-762bd4d7a745b3b19c4ffd3eaf4714a6961c4a11.tar.bz2 |
python/aqmp: add AsyncProtocol._readline() method
This is added as a courtesy: many protocols are line-based, including
QMP. Putting it in AsyncProtocol lets us keep the QMP class
implementation just a pinch more abstract.
(And, if we decide to add a QTEST implementation later, it will need
this, too. (Yes, I have a QTEST implementation.))
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 20210915162955.333025-13-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
Diffstat (limited to 'python')
-rw-r--r-- | python/qemu/aqmp/protocol.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/python/qemu/aqmp/protocol.py b/python/qemu/aqmp/protocol.py index 80c2004..32e7874 100644 --- a/python/qemu/aqmp/protocol.py +++ b/python/qemu/aqmp/protocol.py @@ -796,6 +796,35 @@ class AsyncProtocol(Generic[T]): @upper_half @bottom_half + async def _readline(self) -> bytes: + """ + Wait for a newline from the incoming reader. + + This method is provided as a convenience for upper-layer + protocols, as many are line-based. + + This method *may* return a sequence of bytes without a trailing + newline if EOF occurs, but *some* bytes were received. In this + case, the next call will raise `EOFError`. It is assumed that + the layer 5 protocol will decide if there is anything meaningful + to be done with a partial message. + + :raise OSError: For stream-related errors. + :raise EOFError: + If the reader stream is at EOF and there are no bytes to return. + :return: bytes, including the newline. + """ + assert self._reader is not None + msg_bytes = await self._reader.readline() + + if not msg_bytes: + if self._reader.at_eof(): + raise EOFError + + return msg_bytes + + @upper_half + @bottom_half async def _do_recv(self) -> T: """ Abstract: Read from the stream and return a message. |