Skip to content

Commit 26e3fc8

Browse files
committed
fix: skip blank/whitespace-only lines in receive loop
_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 093a562 commit 26e3fc8

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

src/acp/connection.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ async def _receive_loop(self) -> None:
151151
line = await self._reader.readline()
152152
if not line:
153153
break
154+
line = line.strip()
155+
if not line:
156+
continue
154157
try:
155158
message: dict[str, Any] = json.loads(line)
156159
except Exception:

tests/test_rpc.py

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

318318

319+
@pytest.mark.asyncio
320+
async def test_blank_lines_skipped(connect, server):
321+
connect(connect_agent=True, connect_client=False)
322+
323+
for noise in [b"\n", b" \n", b"\r\n"]:
324+
server.client_writer.write(noise)
325+
req = {"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": 1}}
326+
server.client_writer.write((json.dumps(req) + "\n").encode())
327+
await server.client_writer.drain()
328+
329+
resp = json.loads(await asyncio.wait_for(server.client_reader.readline(), timeout=1))
330+
assert resp["id"] == 1 and "result" in resp
331+
332+
319333
class _ExampleAgent(Agent):
320334
__test__ = False
321335

0 commit comments

Comments
 (0)