Skip to content

Commit 5ffec19

Browse files
wiggzzclaude
andcommitted
Use lax no cover for timing-dependent exception paths; fix ruff format
Change 5 pragma annotations from strict "no cover" to "lax no cover" since these exception handlers may or may not fire depending on cancellation timing. Fix ruff-format in test file. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 8243585 commit 5ffec19

4 files changed

Lines changed: 8 additions & 15 deletions

File tree

src/mcp/server/streamable_http.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -619,14 +619,14 @@ async def sse_writer(): # pragma: lax no cover
619619
# Then send the message to be processed by the server
620620
session_message = self._create_session_message(message, request, request_id, protocol_version)
621621
await writer.send(session_message)
622-
except Exception: # pragma: no cover
622+
except Exception: # pragma: lax no cover
623623
logger.exception("SSE response error")
624624
await sse_stream_writer.aclose()
625625
await self._clean_up_memory_streams(request_id)
626626
finally:
627627
await sse_stream_reader.aclose()
628628

629-
except Exception as err: # pragma: no cover
629+
except Exception as err: # pragma: lax no cover
630630
logger.exception("Error handling POST request")
631631
response = self._create_error_response(
632632
f"Error handling POST request: {err}",
@@ -809,7 +809,7 @@ async def _validate_request_headers(self, request: Request, send: Send) -> bool:
809809

810810
async def _validate_session(self, request: Request, send: Send) -> bool:
811811
"""Validate the session ID in the request."""
812-
if not self.mcp_session_id: # pragma: no cover
812+
if not self.mcp_session_id: # pragma: lax no cover
813813
# If we're not using session IDs, return True
814814
return True
815815

src/mcp/server/streamable_http_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ async def run_stateless_server(*, task_status: TaskStatus[None] = anyio.TASK_STA
178178
self.app.create_initialization_options(),
179179
stateless=True,
180180
)
181-
except Exception: # pragma: no cover
181+
except Exception: # pragma: lax no cover
182182
logger.exception("Stateless session crashed")
183183

184184
# Use a request-scoped task group instead of the global one.

src/mcp/shared/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ async def _receive_loop(self) -> None:
423423
try:
424424
await stream.send(JSONRPCError(jsonrpc="2.0", id=id, error=error))
425425
await stream.aclose()
426-
except Exception: # pragma: no cover
426+
except Exception: # pragma: lax no cover
427427
# Stream might already be closed
428428
pass
429429
self._response_streams.clear()

tests/server/test_streamable_http_manager.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,8 @@ async def handle_call_tool(ctx: ServerRequestContext, params: Any) -> CallToolRe
311311
session_manager = app._session_manager
312312

313313
async def make_and_abandon_tool_call():
314-
async with httpx.AsyncClient(
315-
transport=transport, base_url=f"http://{host}", timeout=30.0
316-
) as http_client:
317-
async with Client(
318-
streamable_http_client(f"http://{host}/mcp", http_client=http_client)
319-
) as client:
314+
async with httpx.AsyncClient(transport=transport, base_url=f"http://{host}", timeout=30.0) as http_client:
315+
async with Client(streamable_http_client(f"http://{host}/mcp", http_client=http_client)) as client:
320316
# Start tool call — this will block until tool completes
321317
# We'll cancel it from outside to simulate disconnect
322318
await client.call_tool("slow_tool", {})
@@ -342,10 +338,7 @@ async def make_and_abandon_tool_call():
342338
await anyio.sleep(0.1)
343339
leaked = len(session_manager._task_group._tasks)
344340

345-
assert leaked == 0, (
346-
f"Expected 0 lingering tasks but found {leaked}. "
347-
f"Stateless request tasks are leaking after client disconnect."
348-
)
341+
assert leaked == 0, f"Expected 0 lingering tasks but found {leaked}. Stateless request tasks are leaking after client disconnect."
349342

350343

351344
@pytest.mark.anyio

0 commit comments

Comments
 (0)