Skip to content
This repository was archived by the owner on Feb 11, 2026. It is now read-only.

Commit 6e595e7

Browse files
committed
бекнул
1 parent ebf2ae1 commit 6e595e7

1 file changed

Lines changed: 23 additions & 96 deletions

File tree

src/pymax/mixins/socket.py

Lines changed: 23 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -52,111 +52,38 @@ def sock(self) -> socket.socket:
5252
raise SocketNotConnectedError()
5353
return self._socket
5454

55-
def _looks_like_lz4_frame(self, payload: bytes) -> bool:
56-
return len(payload) >= 4 and payload[0:4] == b"\x04\x22\x4d\x18"
57-
5855
def _unpack_packet(self, data: bytes) -> dict[str, Any] | None:
59-
if len(data) < 10:
60-
self.logger.warning("Packet too short: %d bytes", len(data))
61-
return None
62-
63-
ver = data[0]
64-
cmd = data[1]
65-
seq = int.from_bytes(data[2:4], "big")
56+
ver = int.from_bytes(data[0:1], "big")
57+
cmd = int.from_bytes(data[1:3], "big")
58+
seq = int.from_bytes(data[3:4], "big")
6659
opcode = int.from_bytes(data[4:6], "big")
6760
packed_len = int.from_bytes(data[6:10], "big", signed=False)
6861
comp_flag = packed_len >> 24
6962
payload_length = packed_len & 0xFFFFFF
70-
71-
if payload_length > self.MAX_PAYLOAD_LENGTH:
72-
self.logger.warning("payload_length too large: %d", payload_length)
73-
return None
74-
75-
if len(data) < 10 + payload_length:
76-
self.logger.warning(
77-
"Not enough bytes for declared payload_length: have=%d need=%d",
78-
len(data) - 10,
79-
payload_length,
80-
)
81-
return None
82-
8363
payload_bytes = data[10 : 10 + payload_length]
8464

85-
if not payload_bytes:
86-
return {"ver": ver, "cmd": cmd, "seq": seq, "opcode": opcode, "payload": None}
87-
88-
try:
89-
payload = msgpack.unpackb(payload_bytes, raw=False, strict_map_key=False)
90-
91-
return {"ver": ver, "cmd": cmd, "seq": seq, "opcode": opcode, "payload": payload}
92-
except Exception as ex_msgpack:
93-
self.logger.debug(
94-
"msgpack direct unpack failed: %s — will try compressed paths", ex_msgpack
95-
)
96-
97-
try:
98-
if self._looks_like_lz4_frame(payload_bytes):
65+
payload = None
66+
if payload_bytes:
67+
if comp_flag != 0:
68+
# TODO: надо выяснить правильный размер распаковки
69+
# uncompressed_size = int.from_bytes(payload_bytes[0:4], "big")
70+
compressed_data = payload_bytes
9971
try:
100-
decompressed = lz4.frame.decompress(payload_bytes)
101-
payload = msgpack.unpackb(decompressed, raw=False, strict_map_key=False)
102-
return {
103-
"ver": ver,
104-
"cmd": cmd,
105-
"seq": seq,
106-
"opcode": opcode,
107-
"payload": payload,
108-
}
109-
except Exception as ex_frame:
110-
self.logger.warning("lz4.frame.decompress failed: %s", ex_frame)
111-
except Exception:
112-
self.logger.exception("Unexpected error testing lz4.frame")
113-
114-
try:
115-
if len(payload_bytes) >= 4:
116-
maybe_size = int.from_bytes(payload_bytes[0:4], "big")
117-
if 0 < maybe_size <= self.MAX_UNCOMPRESSED_SIZE:
118-
compressed_data = payload_bytes[4:]
119-
try:
120-
decompressed = lz4.block.decompress(
121-
compressed_data, uncompressed_size=maybe_size
122-
)
123-
payload = msgpack.unpackb(decompressed, raw=False, strict_map_key=False)
124-
return {
125-
"ver": ver,
126-
"cmd": cmd,
127-
"seq": seq,
128-
"opcode": opcode,
129-
"payload": payload,
130-
}
131-
except (lz4.block.LZ4BlockError, MemoryError) as e:
132-
self.logger.warning("lz4.block with prefixed size failed: %s", e)
133-
else:
134-
self.logger.debug("prefixed size %r not plausible, skipping", maybe_size)
135-
except Exception:
136-
self.logger.exception("Error during prefixed-size lz4 handling")
72+
payload_bytes = lz4.block.decompress(
73+
compressed_data,
74+
uncompressed_size=99999,
75+
)
76+
except lz4.block.LZ4BlockError:
77+
return None
78+
payload = msgpack.unpackb(payload_bytes, raw=False, strict_map_key=False)
13779

138-
try:
139-
try:
140-
decompressed = lz4.block.decompress(
141-
payload_bytes, uncompressed_size=self.MAX_UNCOMPRESSED_SIZE
142-
)
143-
payload = msgpack.unpackb(decompressed, raw=False, strict_map_key=False)
144-
return {"ver": ver, "cmd": cmd, "seq": seq, "opcode": opcode, "payload": payload}
145-
except lz4.block.LZ4BlockError as e:
146-
self.logger.warning("lz4.block.decompress (no-pref) failed: %s", e)
147-
except MemoryError as me:
148-
self.logger.error("MemoryError while decompressing LZ4: %s", me)
149-
except Exception:
150-
self.logger.exception("Unexpected error when attempting lz4.block.decompress")
151-
152-
self.logger.warning(
153-
"Failed to unpack payload: seq=%s opcode=%s comp_flag=%s payload_len=%d",
154-
seq,
155-
opcode,
156-
comp_flag,
157-
payload_length,
158-
)
159-
return None
80+
return {
81+
"ver": ver,
82+
"cmd": cmd,
83+
"seq": seq,
84+
"opcode": opcode,
85+
"payload": payload,
86+
}
16087

16188
def _pack_packet(
16289
self,

0 commit comments

Comments
 (0)