From: Eugene Crosser Date: Tue, 28 Jun 2022 21:10:38 +0000 (+0200) Subject: change error reporting and fix bugs X-Git-Tag: 1.90~43 X-Git-Url: http://www.average.org/gitweb/?p=loctrkd.git;a=commitdiff_plain;h=7bf96d53196eb6caf035335260a2dc25cec72e57 change error reporting and fix bugs --- diff --git a/gps303/collector.py b/gps303/collector.py index 5215d7b..3cb7b0b 100644 --- a/gps303/collector.py +++ b/gps303/collector.py @@ -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: diff --git a/gps303/gps303proto.py b/gps303/gps303proto.py index e6a80fe..baa9a6c 100755 --- a/gps303/gps303proto.py +++ b/gps303/gps303proto.py @@ -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: diff --git a/test/common.py b/test/common.py index 2b45c53..1672f46 100644 --- a/test/common.py +++ b/test/common.py @@ -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 ( "",