diff --git a/README.md b/README.md index 54d713d..9290a8b 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,10 @@ _send(irctokens.format("NICK", ["nickname"])) while True: lines = d.push(s.recv(1024)) + if lines == None: + print("! disconnected") + break + for line in lines: if line.command == "PING": to_send = irctokens.format("PONG", [line.params[0]]) diff --git a/irctokens/stateful.py b/irctokens/stateful.py index 977f300..700fa07 100644 --- a/irctokens/stateful.py +++ b/irctokens/stateful.py @@ -6,7 +6,10 @@ class StatefulDecoder(object): self._fallback = fallback self._buffer = b"" - def push(self, data: bytes) -> typing.List[Line]: + def push(self, data: bytes) -> typing.Optional[typing.List[Line]]: + if not data: + return None + self._buffer += data lines = [l.strip(b"\r") for l in self._buffer.split(b"\n")] self._buffer = lines.pop(-1) diff --git a/test/stateful_decode.py b/test/stateful_decode.py index 1dbb843..bbc5f09 100644 --- a/test/stateful_decode.py +++ b/test/stateful_decode.py @@ -31,3 +31,15 @@ class TestFallback(unittest.TestCase): self.assertEqual(len(lines), 1) line = irctokens.tokenise("PRIVMSG #channel hélló") self.assertEqual(lines[0], line) + +class TestEmpty(unittest.TestCase): + def test_immediate(self): + d = irctokens.StatefulDecoder() + lines = d.push(b"") + self.assertIsNone(lines) + + def test_buffer_unfinished(self): + d = irctokens.StatefulDecoder() + d.push(b"PRIVMSG #channel hello") + lines = d.push(b"") + self.assertIsNone(lines)