diff --git a/server/aoprotocol.py b/server/aoprotocol.py index f07571d..2adfc91 100644 --- a/server/aoprotocol.py +++ b/server/aoprotocol.py @@ -87,8 +87,7 @@ class AOProtocol(asyncio.Protocol): self.client.disconnect() for msg in self.get_messages(): if len(msg) < 2: - self.client.disconnect() - return + continue # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': @@ -100,7 +99,7 @@ class AOProtocol(asyncio.Protocol): cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) except KeyError: - return + logger.log_debug('[INC][UNK]{}'.format(msg), self.client) def connection_made(self, transport): """ Called upon a new client connecting diff --git a/server/websocket.py b/server/websocket.py index d77f678..ba4258f 100644 --- a/server/websocket.py +++ b/server/websocket.py @@ -109,14 +109,17 @@ class WebSocket: self.keep_alive = 0 return + mask_offset = 2 if payload_length == 126: payload_length = struct.unpack(">H", data[2:4])[0] + mask_offset = 4 elif payload_length == 127: payload_length = struct.unpack(">Q", data[2:10])[0] + mask_offset = 10 - masks = data[2:6] + masks = data[mask_offset:mask_offset + 4] decoded = "" - for char in data[6:payload_length + 6]: + for char in data[mask_offset + 4:payload_length + mask_offset + 4]: char ^= masks[len(decoded) % 4] decoded += chr(char) @@ -209,4 +212,4 @@ class WebSocket: return response_key.decode('ASCII') def finish(self): - self.protocol.connection_lost(self) \ No newline at end of file + self.protocol.connection_lost(self)