Skip to content

Commit a6976e1

Browse files
test(server): cover terminate cleanup of orphaned request streams
Exercise terminate()'s remaining _request_streams loop so CI fail-under=100% coverage passes for streamable_http (#2150 / PR #3125). Also mark the defensive registered_stream_id guard as no-branch.
1 parent 60c67a4 commit a6976e1

2 files changed

Lines changed: 8 additions & 1 deletion

File tree

src/mcp/server/streamable_http.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,9 @@ async def send_event(event_message: EventMessage) -> None:
934934

935935
await sse_stream_writer.send(event_data)
936936
finally:
937-
if registered_stream_id is not None:
937+
# registered_stream_id is set immediately on try entry; keep the
938+
# guard for defensive cleanup if re-key is later reordered.
939+
if registered_stream_id is not None: # pragma: no branch
938940
self._sse_stream_writers.pop(registered_stream_id, None)
939941
await self._clean_up_memory_streams(stream_id)
940942
except anyio.ClosedResourceError: # pragma: lax no cover

tests/server/test_streamable_http_manager.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,11 +758,16 @@ async def test_terminate_closes_active_sse_stream_writers():
758758
transport = StreamableHTTPServerTransport(mcp_session_id="test-session-2150")
759759
send_stream, receive_stream = anyio.create_memory_object_stream[object](1)
760760
transport._sse_stream_writers["req-1"] = send_stream # type: ignore[assignment]
761+
# Orphaned request stream with a key NOT also in _sse_stream_writers: close_sse_stream
762+
# only pops matching request streams, so terminate's remaining-keys loop must run.
763+
req_send, req_recv = anyio.create_memory_object_stream[object](1)
764+
transport._request_streams["req-orphan"] = (req_send, req_recv) # type: ignore[assignment]
761765

762766
await transport.terminate()
763767

764768
assert transport.is_terminated
765769
assert "req-1" not in transport._sse_stream_writers
770+
assert not transport._request_streams
766771
with pytest.raises(anyio.ClosedResourceError):
767772
await send_stream.send(object()) # type: ignore[arg-type]
768773
await receive_stream.aclose()

0 commit comments

Comments
 (0)