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.
|
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