Skip to content

Commit eb4d457

Browse files
authored
Fix a bug where cronet_http did not set content-length correctly (#800)
1 parent d6a4bf1 commit eb4d457

File tree

5 files changed

+28
-2
lines changed

5 files changed

+28
-2
lines changed

pkgs/cronet_http/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.0.3
2+
3+
* Fix
4+
[contentLength property is not sent for streamed responses](https://github.com/dart-lang/http/issues/801)
5+
16
## 0.0.2
27

38
* Set `StreamedResponse.reasonPhrase` and `StreamedResponse.request`.

pkgs/cronet_http/lib/cronet_client.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,11 @@ class CronetClient extends BaseClient {
206206
final responseHeaders = (result.headers.cast<String, List<Object?>>())
207207
.map((key, value) => MapEntry(key.toLowerCase(), value.join(',')));
208208

209+
final contentLengthHeader = responseHeaders['content-length'];
209210
return StreamedResponse(responseDataController.stream, result.statusCode,
210-
contentLength: responseHeaders['content-lenght'] as int?,
211+
contentLength: contentLengthHeader == null
212+
? null
213+
: int.tryParse(contentLengthHeader),
211214
reasonPhrase: result.statusText,
212215
request: request,
213216
isRedirect: result.isRedirect,

pkgs/http_client_conformance_tests/lib/src/response_body_server.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@ import 'package:stream_channel/stream_channel.dart';
1717
void hybridMain(StreamChannel<Object?> channel) async {
1818
final server = (await HttpServer.bind('localhost', 0))
1919
..listen((request) async {
20+
const message = 'Hello World!';
2021
await request.drain<void>();
2122
request.response.headers.set('Access-Control-Allow-Origin', '*');
2223
request.response.headers.set('Content-Type', 'text/plain');
23-
request.response.write('Hello World!');
24+
if (request.requestedUri.pathSegments.isNotEmpty &&
25+
request.requestedUri.pathSegments.last == 'length') {
26+
request.response.contentLength = message.length;
27+
}
28+
request.response.write(message);
2429
await request.response.close();
2530
});
2631

pkgs/http_client_conformance_tests/lib/src/response_body_streamed_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void testResponseBodyStreamed(Client client,
4040

4141
final request = Request('GET', Uri.http(host, ''));
4242
final response = await client.send(request);
43+
expect(response.contentLength, null);
4344
var lastReceived = 0;
4445
await const LineSplitter()
4546
.bind(const Utf8Decoder().bind(response.stream))

pkgs/http_client_conformance_tests/lib/src/response_body_tests.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,17 @@ void testResponseBody(Client client,
6060
expect(response.request!.method, 'GET');
6161
expect(response.statusCode, 200);
6262
});
63+
64+
test('small response streamed with content length', () async {
65+
final request = Request('GET', Uri.http(host, 'length'));
66+
final response = await client.send(request);
67+
expect(await response.stream.bytesToString(), message);
68+
expect(response.contentLength, 12);
69+
expect(response.headers['content-type'], 'text/plain');
70+
expect(response.isRedirect, isFalse);
71+
expect(response.reasonPhrase, 'OK');
72+
expect(response.request!.method, 'GET');
73+
expect(response.statusCode, 200);
74+
});
6375
});
6476
}

0 commit comments

Comments
 (0)