- # implement framing properly
- msg = handle_packet(packet, self.addr, when)
- self.buffer = self.buffer[len(packet):]
- if isinstance(msg, LOGIN):
- self.imei = msg.imei
- return msg
+ msgs = []
+ while True:
+ framestart = self.buffer.find(b"xx")
+ if framestart == -1: # No frames, return whatever we have
+ break
+ if framestart > 0: # Should not happen, report
+ log.warning(
+ 'Undecodable data "%s" from fd %d (IMEI %s)',
+ self.buffer[:framestart].hex(),
+ self.sock.fileno(),
+ self.imei,
+ )
+ self.buffer = self.buffer[framestart:]
+ # At this point, buffer starts with a packet
+ frameend = self.buffer.find(b"\r\n", 4)
+ if frameend == -1: # Incomplete frame, return what we have
+ break
+ packet = self.buffer[2:frameend]
+ self.buffer = self.buffer[frameend + 2 :]
+ if proto_of_message(packet) == LOGIN.PROTO:
+ self.imei = parse_message(packet).imei
+ log.info(
+ "LOGIN from fd %d (IMEI %s)", self.sock.fileno(), self.imei
+ )
+ msgs.append((when, self.addr, packet))
+ return msgs