Skip to content

Commit 6a71a02

Browse files
test: cover invalid client response parsing
1 parent 184aafc commit 6a71a02

2 files changed

Lines changed: 17 additions & 2 deletions

File tree

src/mcp/client/auth/oauth2.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import time
1313
from collections.abc import AsyncGenerator, Awaitable, Callable
1414
from dataclasses import dataclass, field
15-
from typing import Any, Protocol, get_args
15+
from typing import Any, Protocol, cast, get_args
1616
from urllib.parse import quote, urlencode, urljoin, urlparse
1717

1818
import anyio
@@ -122,7 +122,7 @@ def _is_invalid_client_response(body: bytes) -> bool:
122122
payload: Any = json.loads(body)
123123
except (json.JSONDecodeError, UnicodeDecodeError):
124124
return False
125-
return isinstance(payload, dict) and payload.get("error") == "invalid_client"
125+
return isinstance(payload, dict) and cast(dict[str, Any], payload).get("error") == "invalid_client"
126126

127127

128128
class PKCEParameters(BaseModel):

tests/client/test_auth.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from mcp.client.auth import OAuthClientProvider, PKCEParameters
1515
from mcp.client.auth.exceptions import OAuthFlowError, OAuthRegistrationError, OAuthTokenError
16+
from mcp.client.auth.oauth2 import _is_invalid_client_response
1617
from mcp.client.auth.utils import (
1718
build_oauth_authorization_server_metadata_discovery_urls,
1819
build_protected_resource_metadata_discovery_urls,
@@ -78,6 +79,20 @@ def client_metadata():
7879
)
7980

8081

82+
@pytest.mark.parametrize(
83+
("body", "expected"),
84+
[
85+
(b"not json", False),
86+
(b"\xff", False),
87+
(b"[]", False),
88+
(b'{"error": "invalid_grant"}', False),
89+
(b'{"error": "invalid_client"}', True),
90+
],
91+
)
92+
def test_invalid_client_response_detection(body: bytes, expected: bool) -> None:
93+
assert _is_invalid_client_response(body) is expected
94+
95+
8196
@pytest.fixture
8297
def valid_tokens():
8398
return OAuthToken(

0 commit comments

Comments
 (0)