php-sdk/tests/Unit/Server
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Valeriu Gutu 1961414432
[Schema][Server] Preserve request id in JSON-RPC error responses instead of fabricating id:"" (#379)
* Preserve request id in JSON-RPC error responses instead of fabricating id:""

When the server received input it could not turn into a valid message, the
error response carried a fabricated empty-string id that was never in the
request, breaking JSON-RPC client correlation.

The id default for the error factories was '' and that default reached the
wire unchanged: unrecoverable parse errors emitted id:"", and for invalid-
but-parseable messages MessageFactory discarded the decoded id so it also
fell back to "".

Now unrecoverable parse errors (-32700) return id: null per JSON-RPC 2.0,
and invalid-but-parseable requests (-32600) preserve the original request
id. Error::$id / getId() and the $id parameter of forParseError() /
forInvalidRequest() are widened to string|int|null, and the recoverable id
is threaded through InvalidInputMessageException.

Fixes #333

* Preserve nullable request id consistently across Error factories and fromArray

- Widen the remaining for*() factories (forMethodNotFound, forInvalidParams,
  forInternalError, forServerError, forResourceNotFound) to string|int|null
  defaulting to null, so no error path can fabricate id:"" again. The only
  defaulting call site (ProtocolVersionMiddleware) now emits id:null instead
  of id:"" for a pre-parse rejection, which is the spec-correct value.
- Accept a null id in Error::fromArray(): require the id key to be present
  (JSON-RPC responses must carry it) but allow its value to be null, so a
  spec-compliant id:null error response round-trips and incoming error
  responses with id:null are accepted instead of rejected.
- Widen the @phpstan-type ErrorData id to string|int|null to match the ctor,
  getId(), and jsonSerialize() shape.

* Document intentional id recovery guard in MessageFactory

* Cover id: 0 and string ids in recoverable-id preservation test

* Fixed client handling of null-id error responses
2026-08-18 15:47:27 +02:00
..
Handler/Request [Capability] Harden structuredContent extraction (#417) 2026-08-15 04:03:20 +02:00
Session [Server] Throw the SDK's own RuntimeException from FileSessionStore (#404) 2026-08-14 21:29:26 +02:00
Transport [Client][Schema][Server] Implement protocol version negotiation (#403) 2026-08-15 01:41:19 +02:00
BuilderTest.php [Schema][Server] Close the 2025-11-25 schema gaps and add the 2026-07-28 surface (#421) 2026-08-17 23:09:39 +02:00
ClientGatewayTest.php [Schema][Client][Server] Close MCP Apps gaps: extension negotiation checks (#429) 2026-08-18 01:46:53 +02:00
ProtocolTest.php [Schema][Server] Preserve request id in JSON-RPC error responses instead of fabricating id:"" (#379) 2026-08-18 15:47:27 +02:00
RequestContextTest.php [Capability] Harden structuredContent extraction (#417) 2026-08-15 04:03:20 +02:00
SessionSubscriptionManagerTest.php Add missing handler for resource subscribe and unsubscribe (#220) 2026-02-18 00:11:35 +01:00