Skip to content

Commit 8de3d9c

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 0133bc4 commit 8de3d9c

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
@@ -282,6 +282,20 @@ async def test_ignore_invalid_messages(connect, server):
282282
await asyncio.wait_for(server.client_reader.readline(), timeout=0.1)
283283

284284

285+
@pytest.mark.asyncio
286+
async def test_blank_lines_skipped(connect, server):
287+
connect(connect_agent=True, connect_client=False)
288+
289+
for noise in [b"\n", b" \n", b"\r\n"]:
290+
server.client_writer.write(noise)
291+
req = {"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": 1}}
292+
server.client_writer.write((json.dumps(req) + "\n").encode())
293+
await server.client_writer.drain()
294+
295+
resp = json.loads(await asyncio.wait_for(server.client_reader.readline(), timeout=1))
296+
assert resp["id"] == 1 and "result" in resp
297+
298+
285299
class _ExampleAgent(Agent):
286300
__test__ = False
287301

0 commit comments

Comments
 (0)