Skip to content

Commit 67b93e5

Browse files
author
Jianke LIN
committed
test(streamable-http): cover disconnect without resumption anchor
1 parent beeb254 commit 67b93e5

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

‎tests/client/test_streamable_http.py‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,30 @@ def test_mcp_name_header_values_are_base64_wrapped_when_unsafe_for_an_http_field
8181
assert encoded == raw
8282

8383

84+
@pytest.mark.anyio
85+
async def test_sse_response_disconnect_before_any_event_id_fails_request() -> None:
86+
transport = StreamableHTTPTransport("http://example.com/mcp")
87+
async with httpx.AsyncClient() as client:
88+
read_stream_writer, read_stream = create_context_streams[SessionMessage | Exception](1)
89+
request = JSONRPCRequest(jsonrpc="2.0", id=1, method="tools/call", params={"name": "noop", "arguments": {}})
90+
ctx = RequestContext(
91+
client=client,
92+
session_id=None,
93+
session_message=SessionMessage(request),
94+
metadata=None,
95+
read_stream_writer=read_stream_writer,
96+
)
97+
response = httpx.Response(200, headers={"content-type": "text/event-stream"}, content=b"")
98+
99+
async with read_stream_writer, read_stream:
100+
await transport._handle_sse_response(response, ctx)
101+
message = await read_stream.receive()
102+
103+
assert isinstance(message.message, JSONRPCError)
104+
assert message.message.id == 1
105+
assert message.message.error.code == CONNECTION_CLOSED
106+
107+
84108
@pytest.mark.anyio
85109
async def test_post_request_merges_per_message_metadata_headers() -> None:
86110
"""`ClientMessageMetadata.headers` on a `SessionMessage` are merged into the outgoing POST headers

0 commit comments

Comments
 (0)