Skip to content

Commit 589aff7

Browse files
authored
fix: skip blank/whitespace-only lines in receive loop (#87)
_receive_loop only checked for EOF (b""), but blank lines like b"\n" or b"\r\n" are truthy and reached json.loads(), causing JSONDecodeError. Strip each line and skip when empty before parsing.
1 parent 3381092 commit 589aff7

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

src/acp/connection.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ async def _receive_loop(self) -> None:
154154
line = await self._reader.readline()
155155
if not line:
156156
break
157+
line = line.strip()
158+
if not line:
159+
continue
157160
try:
158161
message: dict[str, Any] = json.loads(line)
159162
except Exception:

tests/test_rpc.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,20 @@ async def test_ignore_invalid_messages(connect, server):
460460
await asyncio.wait_for(server.client_reader.readline(), timeout=0.1)
461461

462462

463+
@pytest.mark.asyncio
464+
async def test_blank_lines_skipped(connect, server):
465+
connect(connect_agent=True, connect_client=False)
466+
467+
for noise in [b"\n", b" \n", b"\r\n"]:
468+
server.client_writer.write(noise)
469+
req = {"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": 1}}
470+
server.client_writer.write((json.dumps(req) + "\n").encode())
471+
await server.client_writer.drain()
472+
473+
resp = json.loads(await asyncio.wait_for(server.client_reader.readline(), timeout=1))
474+
assert resp["id"] == 1 and "result" in resp
475+
476+
463477
class _ExampleAgent(Agent):
464478
__test__ = False
465479

0 commit comments

Comments
 (0)