Skip to content

Commit be95105

Browse files
committed
fix(client): cover streamable transport error paths
1 parent 602e59d commit be95105

1 file changed

Lines changed: 21 additions & 13 deletions

File tree

src/mcp/client/streamable_http.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -468,25 +468,33 @@ async def _handle_message(session_message: SessionMessage) -> None:
468468
read_stream_writer=read_stream_writer,
469469
)
470470

471-
async def handle_request_async() -> None:
472-
try:
473-
if is_resumption:
474-
await self._handle_resumption_request(ctx)
475-
else:
476-
await self._handle_post_request(ctx)
477-
except httpx.HTTPError as exc:
478-
logger.exception("Transport error handling request")
479-
if isinstance(message, JSONRPCRequest):
471+
# If this is a request, start a new task to handle it
472+
if isinstance(message, JSONRPCRequest):
473+
request_id = message.id
474+
475+
async def handle_request_async() -> None:
476+
try:
477+
if is_resumption:
478+
await self._handle_resumption_request(ctx)
479+
else:
480+
await self._handle_post_request(ctx)
481+
except httpx.HTTPError as exc:
482+
logger.exception("Transport error handling request")
480483
error_data = ErrorData(code=INTERNAL_ERROR, message=f"Transport error: {exc}")
481-
error_msg = SessionMessage(JSONRPCError(jsonrpc="2.0", id=message.id, error=error_data))
484+
error_msg = SessionMessage(JSONRPCError(jsonrpc="2.0", id=request_id, error=error_data))
482485
with contextlib.suppress(anyio.BrokenResourceError, anyio.ClosedResourceError):
483486
await read_stream_writer.send(error_msg)
484487

485-
# If this is a request, start a new task to handle it
486-
if isinstance(message, JSONRPCRequest):
487488
tg.start_soon(handle_request_async)
488489
else:
489-
await handle_request_async()
490+
491+
async def handle_notification_async() -> None:
492+
try:
493+
await self._handle_post_request(ctx)
494+
except httpx.HTTPError:
495+
logger.debug("Transport error handling notification", exc_info=True)
496+
497+
await handle_notification_async()
490498

491499
async for session_message in write_stream_reader:
492500
sender_ctx = write_stream_reader.last_context

0 commit comments

Comments
 (0)