Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions pkgs/http/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
* Preserve header cases in `IOClient`.
* Fix a [bug](https://github.com/dart-lang/http/issues/1934) to release the
underlying connection when an `AbortableRequest` is aborted before its body is read.
* Stop `IOClient` from sending bodyless GET/HEAD requests with
`Transfer-Encoding: chunked` when `BaseRequest.contentLength` is `null`;
`dart:io`'s per-method default framing is used instead. A GET or HEAD request
that streams a non-empty body while leaving `contentLength` `null` now throws
instead of being sent chunked.

## 1.6.0

Expand Down
4 changes: 3 additions & 1 deletion pkgs/http/lib/src/io_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@ class IOClient extends BaseClient {
var ioRequest = (await _inner!.openUrl(request.method, request.url))
..followRedirects = request.followRedirects
..maxRedirects = request.maxRedirects
..contentLength = (request.contentLength ?? -1)
..persistentConnection = request.persistentConnection;
if (request.contentLength case final contentLength?) {
ioRequest.contentLength = contentLength;
}
request.headers.forEach((name, value) {
ioRequest.headers.set(name, value, preserveHeaderCase: true);
});
Expand Down
13 changes: 13 additions & 0 deletions pkgs/http/test/io/streamed_request_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,19 @@ void main() {
expect(await utf8.decodeStream(response.stream),
parse(containsPair('headers', isNot(contains('content-length')))));
});

test('defaults to sending a bodyless GET without framing headers',
() async {
var request = http.StreamedRequest('GET', serverUrl);
unawaited(request.sink.close());
var response = await request.send();
expect(
await utf8.decodeStream(response.stream),
parse(containsPair(
'headers',
allOf(isNot(contains('transfer-encoding')),
isNot(contains('content-length'))))));
});
});

// Regression test.
Expand Down
Loading