Repository navigation
Conversation
…edited and dropped
This was referenced Oct 17, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #354.
What was wrong.
HandleDatarefused DATA on stream 0 and nothing else. DATA on a stream the client had never opened (idle, RFC 9113 5.1) found noPendingRequest. It was credited back to the connection and the stream, and dropped, and the connection carried on serving.The cause the issue gives is out of date.
_highestStreamhas existed since #332: the highest stream id the client has opened, refused ones included. So nothing new is needed to tell an idle stream from a closed one.What changed. One condition in
HandleData. A stream id above_highestStreamis a connection error PROTOCOL_ERROR, the same answer stream 0 gets. Ids at or below it belong to closed streams, not idle ones, and keep today's handling: credited and dropped. No state is added.Proof. The pending Chaos test
h2c: DATA on an idle stream is a PROTOCOL_ERRORis promoted to aTest, and gains two more cases:Run both ways:
expected [GOAWAY PROTOCOL_ERROR], got [HEADERS 1].nghttp2: DATA on stream 0, or on an idle stream, is a PROTOCOL_ERROR, stays green.Suites (main 71aab91 in parentheses):
modprobe tls)ioxide.http2builds for net10.0 and net11.0 with no new warnings.Overlap. #379 (issue #353) also edits
Http2Connection.Frames.cs, inBeginStreamedBodyandTryComplete. The two branches merge cleanly (git merge-tree). On the merged tree, Unit is 102 passed and Chaos 80 passed, both with 0 failed and 0 pending.All eight together. This batch's PRs (#376 to #383) were merged onto main 71aab91 in one scratch tree. The only conflict is the binary
libioxide_ngtcp2.sobetween #376 and #377, rebuilt there from the merged shim with the script's defaults. Everything builds, and Unit 102, E2E 309, Http 88, Chaos 80, Tls 169 (14 kTLS cases skipped) and File 5 pass, with 0 failed and 0 pending. The repo's only pending test left is the Redis suite's (#336).Noticed, not changed. A server that never pushes never opens an even stream id, so every even id is idle.
HandleHeaderschecks only<= _highestStream, though, so a HEADERS on an even id opens a request. RFC 9113 5.1.1 makes that a PROTOCOL_ERROR. As a result, DATA on an even id at or below the highest is still treated as DATA on a closed stream. The fix belongs on the HEADERS path.