From a13c6fa86c33638c8b58cb36e0b0a7d08b4e6756 Mon Sep 17 00:00:00 2001 From: linuswck Date: Mon, 25 Mar 2024 12:40:46 +0800 Subject: [PATCH] pykirdy: Update handling of json objects received - Accept new line delimited json in read_response() --- pykirdy/driver/kirdy_async.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pykirdy/driver/kirdy_async.py b/pykirdy/driver/kirdy_async.py index 11c50f4..70ffb59 100644 --- a/pykirdy/driver/kirdy_async.py +++ b/pykirdy/driver/kirdy_async.py @@ -622,20 +622,26 @@ class Kirdy: self._reader = None self._writer = None - async def _read_response(self): + async def _read_response(self, buffer_size=16384): + """ + Decode newline delimited Json objects and return the latest json received inside the buffer. + - buffer_size: Integer + """ + try: - response = await asyncio.wait_for(self._reader.read(1024), self.timeout) + raw_response = await asyncio.wait_for(self._reader.read(buffer_size), self.timeout) except asyncio.exceptions.TimeoutError: return { "msg_type": "Internal Timeout" } - response = response.decode('utf-8', errors='ignore') - try: - return json.loads(response) - except json.decoder.JSONDecodeError: - return { - "msg_type": "Internal Invalid" - } + + response = raw_response.decode('utf-8', errors='ignore').split("\n") + for item in reversed(response): + try: + return json.loads(item) + except json.decoder.JSONDecodeError: + pass + return { "msg_type": "Internal No json object found in response" } # If the cmd involves a cmd specific data type, # checking is done separately within the functions being called