diff --git a/src/galaxy/api/jsonrpc.py b/src/galaxy/api/jsonrpc.py index e491c3f..eb40ab3 100644 --- a/src/galaxy/api/jsonrpc.py +++ b/src/galaxy/api/jsonrpc.py @@ -74,7 +74,7 @@ class Server(): self._notifications = {} self._eof_listeners = [] self._input_buffer = bytes() - self._input_buffer_it = 0 + self._processed_input_buffer_it = 0 def register_method(self, name, callback, internal, sensitive_params=False): """ @@ -120,18 +120,21 @@ class Server(): async def _readline(self): """Like StreamReader.readline but without limit""" while True: - chunk = await self._reader.read(1024) - self._input_buffer += chunk - it = self._input_buffer.find(b"\n", self._input_buffer_it) - if it < 0: + # check if there is no unprocessed data in the buffer + if not self._input_buffer or self._processed_input_buffer_it != 0: + chunk = await self._reader.read(1024) if not chunk: return bytes() # EOF - else: - self._input_buffer_it = len(self._input_buffer) - continue + self._input_buffer += chunk + + it = self._input_buffer.find(b"\n", self._processed_input_buffer_it) + if it < 0: + self._processed_input_buffer_it = len(self._input_buffer) + continue + line = self._input_buffer[:it] self._input_buffer = self._input_buffer[it+1:] - self._input_buffer_it = 0 + self._processed_input_buffer_it = 0 return line def stop(self):