def test_for_server(self): self.assertTrue(packets.for_server(_TEST_REQUEST)) self.assertFalse( packets.for_server( RpcPacket(type=PacketType.RESPONSE, channel_id=1, service_id=2, method_id=3, payload=RpcPacket(status=321).SerializeToString())))
def process_packet(self, pw_rpc_raw_packet_data: bytes, *impl_args, **impl_kwargs) -> Status: """Processes an incoming packet. Args: pw_rpc_raw_packet_data: raw binary data for exactly one RPC packet impl_args: optional positional arguments passed to the ClientImpl impl_kwargs: optional keyword arguments passed to the ClientImpl Returns: OK - the packet was processed by this client DATA_LOSS - the packet could not be decoded INVALID_ARGUMENT - the packet is for a server, not a client NOT_FOUND - the packet's channel ID is not known to this client """ try: packet = packets.decode(pw_rpc_raw_packet_data) except DecodeError as err: _LOG.warning('Failed to decode packet: %s', err) _LOG.debug('Raw packet: %r', pw_rpc_raw_packet_data) return Status.DATA_LOSS if packets.for_server(packet): return Status.INVALID_ARGUMENT try: channel_client = self._channels_by_id[packet.channel_id] except KeyError: _LOG.warning('Unrecognized channel ID %d', packet.channel_id) return Status.NOT_FOUND try: rpc = self._look_up_service_and_method(packet, channel_client) except ValueError as err: channel_client.channel.output( # type: ignore packets.encode_client_error(packet, Status.NOT_FOUND)) _LOG.warning('%s', err) return Status.OK status = _decode_status(rpc, packet) if packet.type not in (PacketType.RESPONSE, PacketType.SERVER_STREAM_END, PacketType.SERVER_ERROR): _LOG.error('%s: unexpected PacketType %s', rpc, packet.type) _LOG.debug('Packet:\n%s', packet) return Status.OK payload = _decode_payload(rpc, packet) try: context = self._impl.rpcs.get_pending(rpc, status) except KeyError: channel_client.channel.output( # type: ignore packets.encode_client_error(packet, Status.FAILED_PRECONDITION)) _LOG.debug('Discarding response for %s, which is not pending', rpc) return Status.OK if packet.type == PacketType.SERVER_ERROR: assert status is not None and not status.ok() _LOG.warning('%s: invocation failed with %s', rpc, status) self._impl.handle_error(rpc, context, status, args=impl_args, kwargs=impl_kwargs) return Status.OK if payload is not None: self._impl.handle_response(rpc, context, payload, args=impl_args, kwargs=impl_kwargs) if status is not None: self._impl.handle_completion(rpc, context, status, args=impl_args, kwargs=impl_kwargs) return Status.OK