| 23 | data: bytes |
| 24 | |
| 25 | def pretty(self) -> str: |
| 26 | frame_name = f"0x{self.type:x} Frame" |
| 27 | if self.type == 0: |
| 28 | frame_name = "DATA Frame" |
| 29 | elif self.type == 1: |
| 30 | try: |
| 31 | hdrs = pylsqpack.Decoder(4096, 16).feed_header(0, self.data)[1] |
| 32 | return f"HEADERS Frame\n" + "\n".join( |
| 33 | f"{k.decode(errors='backslashreplace')}: {v.decode(errors='backslashreplace')}" |
| 34 | for k, v in hdrs |
| 35 | ) |
| 36 | except Exception as e: |
| 37 | frame_name = f"HEADERS Frame (error: {e})" |
| 38 | elif self.type == 4: |
| 39 | settings = [] |
| 40 | try: |
| 41 | s = parse_settings(self.data) |
| 42 | except Exception as e: |
| 43 | frame_name = f"SETTINGS Frame (error: {e})" |
| 44 | else: |
| 45 | for k, v in s.items(): |
| 46 | try: |
| 47 | key = Setting(k).name |
| 48 | except ValueError: |
| 49 | key = f"0x{k:x}" |
| 50 | settings.append(f"{key}: 0x{v:x}") |
| 51 | return "SETTINGS Frame\n" + "\n".join(settings) |
| 52 | return f"{frame_name}\n" + hex_dump.prettify(self.data, Metadata()) |
| 53 | |
| 54 | |
| 55 | @dataclass(frozen=True) |