I think there's a typo in your commit message subject. Thanks, Niteesh.
On Sat, Jul 17, 2021 at 6:03 AM John Snow <js...@redhat.com> wrote: > Add hooks designed to log/filter incoming/outgoing messages. The primary > intent for these is to be able to support iotests which may want to log > messages with specific filters for reproducible output. > > Another use is for plugging into Urwid frameworks; all messages in/out > can be automatically added to a rendering list for the purposes of a > qmp-shell like tool. > > Signed-off-by: John Snow <js...@redhat.com> > --- > python/qemu/aqmp/protocol.py | 50 +++++++++++++++++++++++++++++++++--- > 1 file changed, 46 insertions(+), 4 deletions(-) > > diff --git a/python/qemu/aqmp/protocol.py b/python/qemu/aqmp/protocol.py > index 86002a52654..6f83d3e3922 100644 > --- a/python/qemu/aqmp/protocol.py > +++ b/python/qemu/aqmp/protocol.py > @@ -176,6 +176,11 @@ class AsyncProtocol(Generic[T]): > can be written after the super() call. > - `_on_message`: > Actions to be performed when a message is received. > + - `_cb_outbound`: > + Logging/Filtering hook for all outbound messages. > + - `_cb_inbound`: > + Logging/Filtering hook for all inbound messages. > + This hook runs *before* `_on_message()`. > > :param name: > Name used for logging messages, if any. By default, messages > @@ -732,6 +737,43 @@ async def _bh_recv_message(self) -> None: > # Section: Message I/O > # -------------------- > > + @upper_half > + @bottom_half > + def _cb_outbound(self, msg: T) -> T: > + """ > + Callback: outbound message hook. > + > + This is intended for subclasses to be able to add arbitrary > + hooks to filter or manipulate outgoing messages. The base > + implementation does nothing but log the message without any > + manipulation of the message. > + > + :param msg: raw outbound message > + :return: final outbound message > + """ > + self.logger.debug("--> %s", str(msg)) > + return msg > + > + @upper_half > + @bottom_half > + def _cb_inbound(self, msg: T) -> T: > + """ > + Callback: inbound message hook. > + > + This is intended for subclasses to be able to add arbitrary > + hooks to filter or manipulate incoming messages. The base > + implementation does nothing but log the message without any > + manipulation of the message. > + > + This method does not "handle" incoming messages; it is a filter. > + The actual "endpoint" for incoming messages is `_on_message()`. > + > + :param msg: raw inbound message > + :return: processed inbound message > + """ > + self.logger.debug("<-- %s", str(msg)) > + return msg > + > @upper_half > @bottom_half > async def _do_recv(self) -> T: > @@ -760,8 +802,8 @@ async def _recv(self) -> T: > > :return: A single (filtered, processed) protocol message. > """ > - # A forthcoming commit makes this method less trivial. > - return await self._do_recv() > + message = await self._do_recv() > + return self._cb_inbound(message) > > @upper_half > @bottom_half > @@ -791,7 +833,7 @@ async def _send(self, msg: T) -> None: > > :raise OSError: For problems with the underlying stream. > """ > - # A forthcoming commit makes this method less trivial. > + msg = self._cb_outbound(msg) > self._do_send(msg) > > @bottom_half > @@ -806,6 +848,6 @@ async def _on_message(self, msg: T) -> None: > directly cause the loop to halt, so logic may be best-kept > to a minimum if at all possible. > > - :param msg: The incoming message > + :param msg: The incoming message, already logged/filtered. > """ > # Nothing to do in the abstract case. > -- > 2.31.1 > >