Skip to content

Commit 19199b3

Browse files
author
ARJUN-TS1
committed
UT Skip empty SSE data to avoid parsing errors
1 parent a666775 commit 19199b3

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

src/mcp/client/sse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ async def sse_reader(
107107
case "message":
108108
# Skip empty data (keep-alive pings)
109109
if not sse.data:
110-
return False
110+
continue
111111
try:
112112
message = types.JSONRPCMessage.model_validate_json( # noqa: E501
113113
sse.data

tests/shared/test_sse.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,3 +532,21 @@ def test_sse_server_transport_endpoint_validation(endpoint: str, expected_result
532532
sse = SseServerTransport(endpoint)
533533
assert sse._endpoint == expected_result
534534
assert sse._endpoint.startswith("/")
535+
536+
537+
@pytest.mark.anyio
538+
async def test_sse_client_handles_empty_keepalive_pings(server: None, server_url: str) -> None:
539+
"""Test that SSE client properly handles empty data lines (keep-alive pings)."""
540+
async with sse_client(server_url + "/sse") as streams:
541+
async with ClientSession(*streams) as session:
542+
# Initialize the session
543+
result = await session.initialize()
544+
assert isinstance(result, InitializeResult)
545+
assert result.serverInfo.name == SERVER_NAME
546+
547+
# Test that we can still make requests after receiving keep-alive pings
548+
# The server may send empty data lines between actual messages
549+
response = await session.read_resource(uri=AnyUrl("foobar://test"))
550+
assert len(response.contents) == 1
551+
assert isinstance(response.contents[0], TextResourceContents)
552+
assert response.contents[0].text == "Read test"

0 commit comments

Comments
 (0)