h-datagram-setting-invalid
· RFC 9297 §2.1.1 · correctness · layer http3 · udp/4501 · MUST
Passing this means: Rejected something invalid, with the code the RFC names.
Anomaly type: control_stream
How each client answered
| Client | Version | Verdict | What happened |
|---|---|---|---|
| curl | libcurl/8.23.0 ngtcp2/1.25.0 | Fail | Objected at the QUIC layer (rejected at the QUIC layer with INTERNAL_ERROR) instead of signalling the HTTP/3 error. The violation was detected and rejected, which is the right instinct; §8.1 requires an HTTP/3 connection error to be carried in an application close, and this test names 0x109. A transport close carries no HTTP/3 code at all, so a peer has no way to learn what was wrong. |
| quinn | noq fork (189b0ed) | Pass | Rejected with the required error code 0x109. |
| aioquic | 1.3.0 (PyPI wheel) | Pass | Rejected with the required error code 0x109. |
| chromium | build 1248 | Pass | Rejected with the required error code 0x109. |
| quic-go | quic-go v0.61.0 (h1:9So2anK4Tp22) | Fail | Rejected, but with error 0x106 where the specification requires 0x109. The violation was detected; the code reported is wrong. |
| quiche | 0.30.0 (1c8e976) | Pass | Rejected with the required error code 0x109. |
| neqo | 0.31.1 (cac2b74) | Pass | Rejected with the required error code 0x109. |
| picoquic | 8162550 | Fail | Accepted a protocol violation and carried on. The anomaly was on the control stream, and this client extended flow-control credit on it -- a receiver extends credit on a stream only once its application has consumed what was already there, so the bytes were read rather than merely delivered. This should have been rejected. |
| ngtcp2 | 3c23148 | Pass | Rejected with the required error code 0x109. |
| lsquic | 4.9.4 (2b30189) | Fail | Accepted a protocol violation and carried on. The anomaly was on the control stream, and this client extended flow-control credit on it -- a receiver extends credit on a stream only once its application has consumed what was already there, so the bytes were read rather than merely delivered. This should have been rejected. |
| xquic | 2060a44 | Inconclusive | The client completed its request and closed without objecting, and the anomaly was on the control stream — a unidirectional stream nothing obliges it to read on any schedule. Accepting the violation and never reaching the stream look the same from here. The one signal that separates reading from receiving is a flow-control credit grant, and a receiver grants credit only as its consumption approaches the window it advertised, so a client with a large window reads everything sent and says nothing. Not a judgement withheld — a distinction this vantage point cannot draw for this client. The client process had already exited 1553ms in, before this test's reaction point at never observed, so the silence after that is not evidence either way. |
| msquic | 2.7.0 (7e6525d) | Fail | Accepted a protocol violation and carried on. The anomaly was on the control stream, and this client extended flow-control credit on it -- a receiver extends credit on a stream only once its application has consumed what was already there, so the bytes were read rather than merely delivered. This should have been rejected. |
| quico | 0.7.0 (npm) | Pass | Rejected with the required error code 0x109. |
What the clause requires
Close the connection with H3_SETTINGS_ERROR. Unusually for a setting, RFC 9297 pins down the invalid-value case rather than leaving it open: the value "MUST be either 0 or 1", and if one "is received with a value that is neither 0 nor 1, the receiver MUST terminate the connection with error H3_SETTINGS_ERROR". This is the setting that gates HTTP Datagrams and so WebTransport, which means a client that implements either has real parsing behind it rather than an ignored identifier.
Judged against RFC 9297.
Run this one yourself
Every test is reachable from your own client. Nothing here needs an account.
curl -s https://conformance.pqcrypta.com/catalog.json \
| jq '.tests[] | select(.id == "h-datagram-setting-invalid")'