Skip to content

Commit 2e5704c

Browse files
committed
fix
1 parent 656be28 commit 2e5704c

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

src/mcp/client/streamable_http.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ async def _handle_sse_response(
420420

421421
try:
422422
event_source = EventSource(response)
423-
async for sse in event_source.aiter_sse(): # pragma: no branch
423+
async for sse in event_source.aiter_sse():
424424
# Track last event ID for potential reconnection
425425
if sse.id:
426426
last_event_id = sse.id
@@ -440,13 +440,17 @@ async def _handle_sse_response(
440440
if is_complete:
441441
await response.aclose()
442442
return # Normal completion, no reconnect needed
443-
except Exception as e: # pragma: no cover
444-
logger.debug(f"SSE stream ended: {e}")
445443

446-
# Stream ended without response - reconnect if we received an event with ID
447-
if last_event_id is not None: # pragma: no branch
448-
logger.info("SSE stream disconnected, reconnecting...")
449-
await self._handle_reconnection(ctx, last_event_id, retry_interval_ms)
444+
# Stream ended without response - try to reconnect if we have an event ID
445+
if last_event_id is not None:
446+
logger.info("SSE stream disconnected, reconnecting...")
447+
await self._handle_reconnection(ctx, last_event_id, retry_interval_ms)
448+
else:
449+
# No event ID received, can't reconnect - report error
450+
raise Exception("SSE stream ended without completing")
451+
except Exception as exc:
452+
logger.exception("Error handling SSE response")
453+
await self._send_error_response(ctx, exc)
450454

451455
async def _handle_reconnection(
452456
self,
@@ -455,11 +459,16 @@ async def _handle_reconnection(
455459
retry_interval_ms: int | None = None,
456460
attempt: int = 0,
457461
) -> None:
458-
"""Reconnect with Last-Event-ID to resume stream after server disconnect."""
462+
"""Reconnect with Last-Event-ID to resume stream after server disconnect.
463+
464+
Raises:
465+
Exception: If max reconnection attempts exceeded or reconnection fails.
466+
"""
459467
# Bail if max retries exceeded
460-
if attempt >= MAX_RECONNECTION_ATTEMPTS: # pragma: no cover
461-
logger.debug(f"Max reconnection attempts ({MAX_RECONNECTION_ATTEMPTS}) exceeded")
462-
return
468+
if attempt >= MAX_RECONNECTION_ATTEMPTS:
469+
raise Exception(
470+
f"SSE stream reconnection failed after {MAX_RECONNECTION_ATTEMPTS} attempts"
471+
)
463472

464473
# Always wait - use server value or default
465474
delay_ms = retry_interval_ms if retry_interval_ms is not None else DEFAULT_RECONNECTION_DELAY_MS
@@ -506,7 +515,7 @@ async def _handle_reconnection(
506515
# Stream ended again without response - reconnect again (reset attempt counter)
507516
logger.info("SSE stream disconnected, reconnecting...")
508517
await self._handle_reconnection(ctx, reconnect_last_event_id, reconnect_retry_ms, 0)
509-
except Exception as e: # pragma: no cover
518+
except Exception as e:
510519
logger.debug(f"Reconnection failed: {e}")
511520
# Try to reconnect again if we still have an event ID
512521
await self._handle_reconnection(ctx, last_event_id, retry_interval_ms, attempt + 1)

0 commit comments

Comments
 (0)