def unpack_from(cls, payload, expected_parts): """Unpack parts from payload""" for num_part in iter_range(expected_parts): hdr = payload.read(cls.header_size) try: part_header = PartHeader(*cls.header_struct.unpack(hdr)) except struct.error: raise InterfaceError("No valid part header") if part_header.payload_size % 8 != 0: part_payload_size = part_header.payload_size + 8 - (part_header.payload_size % 8) else: part_payload_size = part_header.payload_size pl = payload.read(part_payload_size) part_payload = io.BytesIO(pl) try: _PartClass = PART_MAPPING[part_header.part_kind] except KeyError: raise InterfaceError("Unknown part kind %s" % part_header.part_kind) debug('%s (%d/%d): %s', _PartClass.__name__, num_part+1, expected_parts, str(part_header)) debug('Read %d bytes payload for part %d', part_payload_size, num_part + 1) init_arguments = _PartClass.unpack_data(part_header.argument_count, part_payload) debug('Part data: %s', init_arguments) part = _PartClass(*init_arguments) part.header = part_header part.attribute = part_header.part_attributes part.source = 'server' if pyhdb.tracing: part.trace_header = humanhexlify(hdr[:part_header.payload_size]) part.trace_payload = humanhexlify(pl, 30) yield part
def pack(self, remaining_size): """Pack data of part into binary format""" arguments_count, payload = self.pack_data(remaining_size - self.header_size) payload_length = len(payload) # align payload length to multiple of 8 if payload_length % 8 != 0: payload += b"\x00" * (8 - payload_length % 8) self.header = PartHeader(self.kind, self.attribute, arguments_count, self.bigargumentcount, payload_length, remaining_size) hdr = self.header_struct.pack(*self.header) if pyhdb.tracing: self.trace_header = humanhexlify(hdr, 30) self.trace_payload = humanhexlify(payload, 30) return hdr + payload
def test_humanhexlify_shorten(): """Test plain humanhexlify function with shortening to 3 bytes""" b = b'\x01\x62\x70\x00\xff' assert humanhexlify(b, n=3) == b'01 62 70 ...'
def test_humanhexlify(): """Test plain humanhexlify function without shortening""" b = b'\x01\x62\x70\x00\xff' assert humanhexlify(b) == b'01 62 70 00 ff'