Protect TCP_NODELAY changes while sending headers - #172
Merged
Conversation
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.
A peer disconnect can let the terminating header write succeed but make the following TCP_NODELAY restoration throw. In that case send-headers exits before returning the body writer, leaving Connection.current-writer_ set while ResponseWriter.body-writer_ is null. Later cleanup then fails with Previous request not completed.
Keep the TCP_NODELAY disable inside the guarded header-send sequence and restore TCP_NODELAY in finally after the complete header is written. A nested success flag closes and resets the connection if restoration itself throws without masking a header-write failure.
The regression test now checks specifically for Previous request not completed. Other close traces vary by OS and SDK, including an intermittent SDK-level Success read error, and are outside this regression.
Fixes the failure in https://github.com/toitlang/pkg-http/actions/runs/32307179434/job/96242345996
Validation: