diff options
Diffstat (limited to 'python')
-rw-r--r-- | python/qemu/aqmp/protocol.py | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/python/qemu/aqmp/protocol.py b/python/qemu/aqmp/protocol.py index 2ef19e9693..80c2004737 100644 --- a/python/qemu/aqmp/protocol.py +++ b/python/qemu/aqmp/protocol.py @@ -177,6 +177,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 @@ -754,6 +759,43 @@ class AsyncProtocol(Generic[T]): @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: """ Abstract: Read from the stream and return a message. @@ -780,8 +822,8 @@ class AsyncProtocol(Generic[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 @@ -811,7 +853,7 @@ class AsyncProtocol(Generic[T]): :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 @@ -826,6 +868,6 @@ class AsyncProtocol(Generic[T]): 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. |