Fix parsing of folded header field values.

Bug: https://github.com/dart-lang/sdk/issues/53227
Bug: https://github.com/dart-lang/sdk/issues/53185
Change-Id: Ibbdbdf9c8f2875e8f687244982810fffee20e69c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/320920
Commit-Queue: Brian Quinlan <bquinlan@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
This commit is contained in:
Brian Quinlan 2023-09-11 21:13:58 +00:00 committed by Commit Queue
parent a4381f127c
commit 8a91749e42
3 changed files with 42 additions and 8 deletions

View file

@ -88,7 +88,12 @@ constraint][language version] lower bound to 3.2 or greater (`sdk: '^3.2.0'`).
`HttpClientResponse.headers` and `HttpRequest.headers` no longer include
trailing whitespace in their values.
- **Breaking change** [#53227][]: Folded headers values returned by
`HttpClientResponse.headers` and `HttpRequest.headers` now have a space
inserted at the fold point.
[#53005]: https://dartbug.com/53005
[#53227]: https://dartbug.com/53227
#### `dart:isolate`

View file

@ -680,7 +680,13 @@ class _HttpParser extends Stream<_HttpIncoming> {
case _State.HEADER_VALUE_FOLD_OR_END:
if (byte == _CharCode.SP || byte == _CharCode.HT) {
_state = _State.HEADER_VALUE_START;
// This is an obs-fold as defined in RFC 7230 and we should
// "...replace each received obs-fold with one or more SP octets
// prior to interpreting the field value or forwarding the
// message downstream."
// See https://www.rfc-editor.org/rfc/rfc7230#section-3.2.4
_addWithValidation(_headerValue, _CharCode.SP);
_state = _State.HEADER_VALUE_START; // Strips leading whitespace.
} else {
String headerField = String.fromCharCodes(_headerField);
// The field value does not include any leading or trailing whitespace.

View file

@ -425,19 +425,42 @@ Empty-Header-2:\t \t \r
headers["empty-header-2"] = "";
_testParseRequestLean(request, "POST", "/test", expectedHeaders: headers);
// Test folded headers.
request = """
POST /test HTTP/1.1\r
Header-A: \t AA\r
A \t \r
X-Header-B: b\r
b\r
\t b \t \r
Header-A: h\r
ell\r
o\r
X-Header-B: w\r
o\r
r\r
l\r
d\r
\r
""";
headers = new Map();
headers["header-a"] = "AAA";
headers["x-header-b"] = "bbb";
headers["header-a"] = "h ell o";
headers["x-header-b"] = "w o r l d";
_testParseRequestLean(request, "POST", "/test", expectedHeaders: headers);
// Test folded headers with leading and trailing whitespace.
request = """
POST /test HTTP/1.1\r
Header-A: \t h \t \r
\t ell \t \t \r
\to \t \r
X-Header-B:w\r
\t\to\t\t\r
\t\tr\t\t\r
\tl \r
\td \t\r
\r
""";
headers = new Map();
headers["header-a"] = "h \t ell \t \t o";
headers["x-header-b"] = "w o\t\t r\t\t l d";
_testParseRequestLean(request, "POST", "/test", expectedHeaders: headers);
// _testParseRequestLean encodes the request as ISO-8859-1. Test that the