@@ -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