fix(session): return METHOD_NOT_FOUND for unknown request methods - #3210
fix(session): return METHOD_NOT_FOUND for unknown request methods#3210Ranga-Prasath-22 wants to merge 4 commits into
Conversation
|
Just a quiet follow-up with some verification evidence, no rush -- I know the queue is deep. Status: this PR makes the session return JSON-RPC -32601 (METHOD_NOT_FOUND) for unknown request methods instead of -32602 (INVALID_PARAMS). Repro (stdlib + SDK only, anyio memory streams against # send an unknown-method request to a ServerSession
await client_to_server_send.send(SessionMessage(types.JSONRPCMessage(
types.JSONRPCRequest(jsonrpc="2.0", id=1, method="totally/bogus", params={}))))
resp = await server_to_client_receive.receive()
print(resp.message.root.error.code, resp.message.root.error.message)Observed (same script,
Also checked for regressions: a known method with malformed params ( Happy to add docs or adjust the error message wording if that's the blocker -- could I get a review pass? |
t is typed Any, so t.model_fields["method"].default is already Any; the cast(Any, ...) was redundant and tripped pyright's reportUnnecessaryCast, which fails the pre-commit hook. Drop the cast and the now-unused import.
Follow-up: fix the pre-commit (pyright) failureRoot cause. Fix. Drop the Verification.
|
0809android
left a comment
There was a problem hiding this comment.
AI assistance disclosure: I used Codex to inspect the current diff and repository guidance. The cited control flow and rule were checked against the current PR head.
|
|
||
| _unpack_union(union_type) | ||
| return frozenset(methods) | ||
| except Exception: |
There was a problem hiding this comment.
Could we avoid catching Exception here? The repository guidance reserves broad exception handling for top-level handlers. This also fails silently: returning an empty set makes _get_request_validation_error() classify every unknown method as INVALID_PARAMS, so a future Pydantic schema-shape change would quietly disable this fix. Please handle only the expected schema shapes/errors and keep unexpected introspection failures visible through a focused test.
|
Thanks for the contribution. This repository only keeps pull requests open when they're linked to an issue that a maintainer has assigned to the author — CONTRIBUTING.md explains why and how we work. This PR has been closed for now because its description doesn't yet link an open issue in this repository (with If there isn't an issue for this yet, please open one — a clear description of the problem is genuinely the most useful thing for us. Then add There's no need to open a new PR — this one will be reopened. While it's closed, please push any updates as new commits rather than force-pushing, since GitHub can't reopen a PR whose branch has been rewritten. Maintainers: reopening this PR, removing the |
Summary
Return JSON-RPC
-32601 METHOD_NOT_FOUNDfor request methods that are not part of the session's request schema, while preserving-32602 INVALID_PARAMSfor known methods with invalid parameters. Error responses echo the requestidunchanged.Why
BaseSessionpreviously mapped every request-model validation failure to-32602. That made an unsupported method indistinguishable from a malformed call and caused clients to retry requests that could never succeed.Implementation
BaseSession, covering both client and server sessions and custom request unions.Behavior note
Validation-error responses no longer include the empty
data=""field (-32602and the new-32601paths both omit it). This is spec-legal — the JSON-RPCdatamember is optional and its type is implementation-defined — and matches the TypeScript SDK, but clients inspectingerror.datamay notice the change.Tests
_extract_known_request_methodsextracts the full expected method set forClientRequest/ServerRequest, plus fallback behavior for non-string defaults and introspection failures.Validation
tests/shared/test_session.py,tests/server/test_session.py).Fixes #3193
Resolves #1561