Repository navigation
Fix: accept zero-length header field continuation at receive boundaries - #210
Draft
kstribrnAmzn wants to merge 1 commit into
Draft
kstribrnAmzn wants to merge 1 commit into
kstribrnAmzn wants to merge 1 commit into
Conversation
When a transport receive ends exactly at the end of a header field name, llhttp reopens the field span at the start of the next llhttp_execute() buffer and closes it at the ':' separator, invoking on_header_field with a length of zero. This is a valid streaming continuation of the field. The zero-length guard added to httpParserOnHeaderFieldCallback() in FreeRTOS#204 rejected every zero-length callback with LLHTTP_STOP_PARSING, so valid responses failed with HTTPParserInternalError whenever a receive boundary fell right after a header field name (including byte-at-a-time receives). Only reject a zero-length field when no header field is in progress. Genuinely empty header field names are still rejected by llhttp itself (HTTPSecurityAlertInvalidCharacter) before any span callback fires. Add a unit test that splits the response at the end of a header field name and expects the response to parse successfully.
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.
Description
When a transport receive ends exactly at the end of a header field name, llhttp reopens the field span at the start of the next llhttp_execute() buffer and closes it at the ':' separator, invoking on_header_field with a length of zero. This is a valid streaming continuation of the field.
The zero-length guard added to httpParserOnHeaderFieldCallback() in #204 rejected every zero-length callback with LLHTTP_STOP_PARSING, so valid responses failed with HTTPParserInternalError whenever a receive boundary fell right after a header field name (including byte-at-a-time receives).
Only reject a zero-length field when no header field is in progress. Genuinely empty header field names are still rejected by llhttp itself (HTTPSecurityAlertInvalidCharacter) before any span callback fires.
Test Steps
Add a unit test that splits the response at the end of a header field name and expects the response to parse successfully.
Checklist:
Related Issue
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.