- self.buffer += packet
- # implement framing properly
- msg = handle_packet(packet, self.clntaddr, when)
- self.buffer = self.buffer[len(packet):]
- if isinstance(msg, LOGIN):
- self.imei = msg.imei
- return msg
+ self.buffer += segment
+ 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
+ msg = parse_message(self.buffer[:frameend])
+ self.buffer = self.buffer[frameend+2:]
+ if isinstance(msg, LOGIN):
+ self.imei = msg.imei
+ log.info("LOGIN from fd %d: IMEI %s",
+ self.sock.fileno(), self.imei)
+ msgs.append(msg)
+ return msgs