]> www.average.org Git - loctrkd.git/blobdiff - gps303/collector.py
A hack in packet framing to false stop bytes match
[loctrkd.git] / gps303 / collector.py
index b8cc379a16a5cbac14615ead70e84b841e7425ab..7326e1f3affa9704f17b5e2a27d597aab0dff7f6 100644 (file)
@@ -69,7 +69,20 @@ class Client:
                 )
                 self.buffer = self.buffer[framestart:]
             # At this point, buffer starts with a packet
-            frameend = self.buffer.find(b"\r\n", 4)
+            if len(self.buffer) < 6:  # no len and proto - cannot proceed
+                break
+            exp_end = self.buffer[2] + 3  # Expect '\r\n' here
+            frameend = 0
+            # Length field can legitimeely be much less than the
+            # length of the packet (e.g. WiFi positioning), but
+            # it _should not_ be greater. Still sometimes it is.
+            # Luckily, not by too much: by maybe two or three bytes?
+            # Do this embarrassing hack to avoid accidental match
+            # of some binary data in the packet against '\r\n'.
+            while True:
+                frameend = self.buffer.find(b"\r\n", frameend)
+                if frameend >= (exp_end - 3):  # Found realistic match
+                    break
             if frameend == -1:  # Incomplete frame, return what we have
                 break
             packet = self.buffer[2:frameend]
@@ -167,15 +180,6 @@ def runserver(conf):
                         try:
                             msg = zpull.recv(zmq.NOBLOCK)
                             zmsg = Resp(msg)
-                            zpub.send(
-                                Bcast(
-                                    is_incoming=False,
-                                    proto=proto_of_message(zmsg.packet),
-                                    when=zmsg.when,
-                                    imei=zmsg.imei,
-                                    packet=zmsg.packet,
-                                ).packed
-                            )
                             tosend.append(zmsg)
                         except zmq.Again:
                             break
@@ -210,7 +214,7 @@ def runserver(conf):
                                 tostop.append(sk)
                             respmsg = inline_response(packet)
                             if respmsg is not None:
-                                clients.response(
+                                tosend.append(
                                     Resp(imei=imei, when=when, packet=respmsg)
                                 )
                 else:
@@ -220,6 +224,15 @@ def runserver(conf):
                 poller.unregister(fd)
                 clients.stop(fd)
             for zmsg in tosend:
+                zpub.send(
+                    Bcast(
+                        is_incoming=False,
+                        proto=proto_of_message(zmsg.packet),
+                        when=zmsg.when,
+                        imei=zmsg.imei,
+                        packet=zmsg.packet,
+                    ).packed
+                )
                 log.debug("Sending to the client: %s", zmsg)
                 clients.response(zmsg)
             for clntsock, clntaddr in topoll: