]> www.average.org Git - loctrkd.git/commitdiff
change error reporting and fix bugs
authorEugene Crosser <crosser@average.org>
Tue, 28 Jun 2022 21:10:38 +0000 (23:10 +0200)
committerEugene Crosser <crosser@average.org>
Thu, 14 Jul 2022 20:29:12 +0000 (22:29 +0200)
gps303/collector.py
gps303/gps303proto.py
test/common.py

index 5215d7b42289762b8b8bc79b2da0de0ec2203e09..3cb7b0bda98b09a961af7f5cc834ea95ae46a76a 100644 (file)
@@ -19,7 +19,6 @@ import zmq
 from . import common
 from .gps303proto import (
     GPS303Conn,
-    StreamError,
     HIBERNATION,
     LOGIN,
     inline_response,
@@ -69,16 +68,18 @@ class Client:
             )
             return None
         when = time()
-        while True:
-            try:
-                return [
-                    (when, self.addr, packet)
-                    for packet in self.stream.recv(segment)
-                ]
-            except StreamError as e:
+        msgs = []
+        for elem in self.stream.recv(segment):
+            if isinstance(elem, bytes):
+                msgs.append((when, self.addr, elem))
+            else:
                 log.warning(
-                    "%s from fd %d (IMEI %s)", e, self.sock.fileno(), self.imei
+                    "%s from fd %d (IMEI %s)",
+                    elem,
+                    self.sock.fileno(),
+                    self.imei,
                 )
+        return msgs
 
     def send(self, buffer: bytes) -> None:
         try:
index e6a80fe5118f4df0c8370539290a13c44e6de821..baa9a6cf64ac7af7b6fcb5605de3783f02b35955 100755 (executable)
@@ -33,7 +33,6 @@ from typing import (
 
 __all__ = (
     "GPS303Conn",
-    "StreamError",
     "class_by_prefix",
     "inline_response",
     "parse_message",
@@ -85,10 +84,6 @@ __all__ = (
 MAXBUFFER: int = 4096
 
 
-class StreamError(Exception):
-    pass
-
-
 class GPS303Conn:
     def __init__(self) -> None:
         self.buffer = b""
@@ -97,25 +92,27 @@ class GPS303Conn:
     def enframe(buffer: bytes) -> bytes:
         return b"xx" + buffer + b"\r\n"
 
-    def recv(self, segment: bytes) -> List[bytes]:
+    def recv(self, segment: bytes) -> List[Union[bytes, str]]:
+        """
+        Process next segment of the stream. Return successfully deframed
+        packets as `bytes` and error messages as `str`.
+        """
         when = time()
         self.buffer += segment
         if len(self.buffer) > MAXBUFFER:
             # We are receiving junk. Let's drop it or we run out of memory.
             self.buffer = b""
-            raise StreamError(
-                f"More than {MAXBUFFER} unparseable data, dropping"
-            )
-        msgs = []
+            return [f"More than {MAXBUFFER} unparseable data, dropping"]
+        msgs: List[Union[bytes, str]] = []
         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
-                self.buffer = self.buffer[framestart:]
-                raise StreamError(
+                msgs.append(
                     f'Undecodable data ({framestart}) "{self.buffer[:framestart][:64].hex()}"'
                 )
+                self.buffer = self.buffer[framestart:]
             # At this point, buffer starts with a packet
             if len(self.buffer) < 6:  # no len and proto - cannot proceed
                 break
@@ -138,8 +135,9 @@ class GPS303Conn:
             packet = self.buffer[2:frameend]
             self.buffer = self.buffer[frameend + 2 :]
             if len(packet) < 2:  # frameend comes too early
-                raise StreamError(f"Packet too short: {packet.hex()}")
-            msgs.append(packet)
+                msgs.append(f"Packet too short: {packet.hex()}")
+            else:
+                msgs.append(packet)
         return msgs
 
     def close(self) -> bytes:
index 2b45c53400cc2ab363752f4dd5a02eee9ce714e8..1672f46029c663eb79436d0add7bbc5ef9259227 100644 (file)
@@ -87,7 +87,7 @@ class TestWithServers(TestCase):
             self.assertEqual(
                 p.exitcode,
                 0,
-                srvname + " terminated with non-zero return code",
+                f"{srvname} terminated with return code {p.exitcode}",
             )
         for sfx in (
             "",