Update consolidateHttpClientResponseBytes() to use compressionState (#33729)
This updates to use the new HttpClientResponse.compressionState API that was recently added in the SDK. https://github.com/flutter/flutter/issues/32374
This commit is contained in:
parent
3999077c95
commit
306a09a384
@ -43,10 +43,8 @@ typedef BytesReceivedCallback = void Function(int cumulative, int total);
|
|||||||
/// bytes from this method (assuming the response is sending compressed bytes),
|
/// bytes from this method (assuming the response is sending compressed bytes),
|
||||||
/// set both [HttpClient.autoUncompress] to false and the `autoUncompress`
|
/// set both [HttpClient.autoUncompress] to false and the `autoUncompress`
|
||||||
/// parameter to false.
|
/// parameter to false.
|
||||||
// TODO(tvolkert): Remove the [client] param once https://github.com/dart-lang/sdk/issues/36971 is fixed.
|
|
||||||
Future<Uint8List> consolidateHttpClientResponseBytes(
|
Future<Uint8List> consolidateHttpClientResponseBytes(
|
||||||
HttpClientResponse response, {
|
HttpClientResponse response, {
|
||||||
HttpClient client,
|
|
||||||
bool autoUncompress = true,
|
bool autoUncompress = true,
|
||||||
BytesReceivedCallback onBytesReceived,
|
BytesReceivedCallback onBytesReceived,
|
||||||
}) {
|
}) {
|
||||||
@ -58,15 +56,21 @@ Future<Uint8List> consolidateHttpClientResponseBytes(
|
|||||||
int expectedContentLength = response.contentLength;
|
int expectedContentLength = response.contentLength;
|
||||||
if (expectedContentLength == -1)
|
if (expectedContentLength == -1)
|
||||||
expectedContentLength = null;
|
expectedContentLength = null;
|
||||||
if (response.headers?.value(HttpHeaders.contentEncodingHeader) == 'gzip') {
|
switch (response.compressionState) {
|
||||||
if (client?.autoUncompress ?? true) {
|
case HttpClientResponseCompressionState.compressed:
|
||||||
// response.contentLength will not match our bytes stream, so we declare
|
if (autoUncompress) {
|
||||||
// that we don't know the expected content length.
|
|
||||||
expectedContentLength = null;
|
|
||||||
} else if (autoUncompress) {
|
|
||||||
// We need to un-compress the bytes as they come in.
|
// We need to un-compress the bytes as they come in.
|
||||||
sink = gzip.decoder.startChunkedConversion(output);
|
sink = gzip.decoder.startChunkedConversion(output);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case HttpClientResponseCompressionState.decompressed:
|
||||||
|
// response.contentLength will not match our bytes stream, so we declare
|
||||||
|
// that we don't know the expected content length.
|
||||||
|
expectedContentLength = null;
|
||||||
|
break;
|
||||||
|
case HttpClientResponseCompressionState.notCompressed:
|
||||||
|
// Fall-through.
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bytesReceived = 0;
|
int bytesReceived = 0;
|
||||||
|
@ -552,7 +552,6 @@ class NetworkImage extends ImageProvider<NetworkImage> {
|
|||||||
|
|
||||||
final Uint8List bytes = await consolidateHttpClientResponseBytes(
|
final Uint8List bytes = await consolidateHttpClientResponseBytes(
|
||||||
response,
|
response,
|
||||||
client: _httpClient,
|
|
||||||
onBytesReceived: (int cumulative, int total) {
|
onBytesReceived: (int cumulative, int total) {
|
||||||
chunkEvents.add(ImageChunkEvent(
|
chunkEvents.add(ImageChunkEvent(
|
||||||
cumulativeBytesLoaded: cumulative,
|
cumulativeBytesLoaded: cumulative,
|
||||||
|
@ -14,17 +14,11 @@ void main() {
|
|||||||
group(consolidateHttpClientResponseBytes, () {
|
group(consolidateHttpClientResponseBytes, () {
|
||||||
final List<int> chunkOne = <int>[0, 1, 2, 3, 4, 5];
|
final List<int> chunkOne = <int>[0, 1, 2, 3, 4, 5];
|
||||||
final List<int> chunkTwo = <int>[6, 7, 8, 9, 10];
|
final List<int> chunkTwo = <int>[6, 7, 8, 9, 10];
|
||||||
MockHttpClient client;
|
|
||||||
MockHttpClientResponse response;
|
MockHttpClientResponse response;
|
||||||
MockHttpHeaders headers;
|
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
client = MockHttpClient();
|
|
||||||
response = MockHttpClientResponse();
|
response = MockHttpClientResponse();
|
||||||
headers = MockHttpHeaders();
|
when(response.compressionState).thenReturn(HttpClientResponseCompressionState.notCompressed);
|
||||||
when(client.autoUncompress).thenReturn(true);
|
|
||||||
when(response.headers).thenReturn(headers);
|
|
||||||
when(headers.value(HttpHeaders.contentEncodingHeader)).thenReturn(null);
|
|
||||||
when(response.listen(
|
when(response.listen(
|
||||||
any,
|
any,
|
||||||
onDone: anyNamed('onDone'),
|
onDone: anyNamed('onDone'),
|
||||||
@ -50,7 +44,7 @@ void main() {
|
|||||||
when(response.contentLength)
|
when(response.contentLength)
|
||||||
.thenReturn(chunkOne.length + chunkTwo.length);
|
.thenReturn(chunkOne.length + chunkTwo.length);
|
||||||
final List<int> bytes =
|
final List<int> bytes =
|
||||||
await consolidateHttpClientResponseBytes(response, client: client);
|
await consolidateHttpClientResponseBytes(response);
|
||||||
|
|
||||||
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
||||||
});
|
});
|
||||||
@ -58,7 +52,7 @@ void main() {
|
|||||||
test('Converts a compressed HttpClientResponse with contentLength to bytes', () async {
|
test('Converts a compressed HttpClientResponse with contentLength to bytes', () async {
|
||||||
when(response.contentLength).thenReturn(chunkOne.length);
|
when(response.contentLength).thenReturn(chunkOne.length);
|
||||||
final List<int> bytes =
|
final List<int> bytes =
|
||||||
await consolidateHttpClientResponseBytes(response, client: client);
|
await consolidateHttpClientResponseBytes(response);
|
||||||
|
|
||||||
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
||||||
});
|
});
|
||||||
@ -66,7 +60,7 @@ void main() {
|
|||||||
test('Converts an HttpClientResponse without contentLength to bytes', () async {
|
test('Converts an HttpClientResponse without contentLength to bytes', () async {
|
||||||
when(response.contentLength).thenReturn(-1);
|
when(response.contentLength).thenReturn(-1);
|
||||||
final List<int> bytes =
|
final List<int> bytes =
|
||||||
await consolidateHttpClientResponseBytes(response, client: client);
|
await consolidateHttpClientResponseBytes(response);
|
||||||
|
|
||||||
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
||||||
});
|
});
|
||||||
@ -77,7 +71,6 @@ void main() {
|
|||||||
final List<int> records = <int>[];
|
final List<int> records = <int>[];
|
||||||
await consolidateHttpClientResponseBytes(
|
await consolidateHttpClientResponseBytes(
|
||||||
response,
|
response,
|
||||||
client: client,
|
|
||||||
onBytesReceived: (int cumulative, int total) {
|
onBytesReceived: (int cumulative, int total) {
|
||||||
records.addAll(<int>[cumulative, total]);
|
records.addAll(<int>[cumulative, total]);
|
||||||
},
|
},
|
||||||
@ -114,7 +107,7 @@ void main() {
|
|||||||
});
|
});
|
||||||
when(response.contentLength).thenReturn(-1);
|
when(response.contentLength).thenReturn(-1);
|
||||||
|
|
||||||
expect(consolidateHttpClientResponseBytes(response, client: client),
|
expect(consolidateHttpClientResponseBytes(response),
|
||||||
throwsA(isInstanceOf<Exception>()));
|
throwsA(isInstanceOf<Exception>()));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -122,7 +115,6 @@ void main() {
|
|||||||
when(response.contentLength).thenReturn(-1);
|
when(response.contentLength).thenReturn(-1);
|
||||||
final Future<List<int>> result = consolidateHttpClientResponseBytes(
|
final Future<List<int>> result = consolidateHttpClientResponseBytes(
|
||||||
response,
|
response,
|
||||||
client: client,
|
|
||||||
onBytesReceived: (int cumulative, int total) {
|
onBytesReceived: (int cumulative, int total) {
|
||||||
throw 'misbehaving callback';
|
throw 'misbehaving callback';
|
||||||
},
|
},
|
||||||
@ -137,7 +129,7 @@ void main() {
|
|||||||
final List<int> gzippedChunkTwo = gzipped.sublist(gzipped.length ~/ 2);
|
final List<int> gzippedChunkTwo = gzipped.sublist(gzipped.length ~/ 2);
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
when(headers.value(HttpHeaders.contentEncodingHeader)).thenReturn('gzip');
|
when(response.compressionState).thenReturn(HttpClientResponseCompressionState.compressed);
|
||||||
when(response.listen(
|
when(response.listen(
|
||||||
any,
|
any,
|
||||||
onDone: anyNamed('onDone'),
|
onDone: anyNamed('onDone'),
|
||||||
@ -159,27 +151,26 @@ void main() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Uncompresses GZIP bytes if autoUncompress is true and response.autoUncompress is false', () async {
|
test('Uncompresses GZIP bytes if autoUncompress is true and response.compressionState is compressed', () async {
|
||||||
when(client.autoUncompress).thenReturn(false);
|
when(response.compressionState).thenReturn(HttpClientResponseCompressionState.compressed);
|
||||||
when(response.contentLength).thenReturn(gzipped.length);
|
when(response.contentLength).thenReturn(gzipped.length);
|
||||||
final List<int> bytes = await consolidateHttpClientResponseBytes(response, client: client);
|
final List<int> bytes = await consolidateHttpClientResponseBytes(response);
|
||||||
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
expect(bytes, <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('returns gzipped bytes if autoUncompress is false and response.autoUncompress is false', () async {
|
test('returns gzipped bytes if autoUncompress is false and response.compressionState is compressed', () async {
|
||||||
when(client.autoUncompress).thenReturn(false);
|
when(response.compressionState).thenReturn(HttpClientResponseCompressionState.compressed);
|
||||||
when(response.contentLength).thenReturn(gzipped.length);
|
when(response.contentLength).thenReturn(gzipped.length);
|
||||||
final List<int> bytes = await consolidateHttpClientResponseBytes(response, client: client, autoUncompress: false);
|
final List<int> bytes = await consolidateHttpClientResponseBytes(response, autoUncompress: false);
|
||||||
expect(bytes, gzipped);
|
expect(bytes, gzipped);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Notifies onBytesReceived with gzipped numbers', () async {
|
test('Notifies onBytesReceived with gzipped numbers', () async {
|
||||||
when(client.autoUncompress).thenReturn(false);
|
when(response.compressionState).thenReturn(HttpClientResponseCompressionState.compressed);
|
||||||
when(response.contentLength).thenReturn(gzipped.length);
|
when(response.contentLength).thenReturn(gzipped.length);
|
||||||
final List<int> records = <int>[];
|
final List<int> records = <int>[];
|
||||||
await consolidateHttpClientResponseBytes(
|
await consolidateHttpClientResponseBytes(
|
||||||
response,
|
response,
|
||||||
client: client,
|
|
||||||
onBytesReceived: (int cumulative, int total) {
|
onBytesReceived: (int cumulative, int total) {
|
||||||
records.addAll(<int>[cumulative, total]);
|
records.addAll(<int>[cumulative, total]);
|
||||||
},
|
},
|
||||||
@ -193,13 +184,13 @@ void main() {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Notifies onBytesReceived with expectedContentLength of -1 if response.autoUncompress is true', () async {
|
test('Notifies onBytesReceived with expectedContentLength of -1 if response.compressionState is decompressed', () async {
|
||||||
final int syntheticTotal = (chunkOne.length + chunkTwo.length) * 2;
|
final int syntheticTotal = (chunkOne.length + chunkTwo.length) * 2;
|
||||||
|
when(response.compressionState).thenReturn(HttpClientResponseCompressionState.decompressed);
|
||||||
when(response.contentLength).thenReturn(syntheticTotal);
|
when(response.contentLength).thenReturn(syntheticTotal);
|
||||||
final List<int> records = <int>[];
|
final List<int> records = <int>[];
|
||||||
await consolidateHttpClientResponseBytes(
|
await consolidateHttpClientResponseBytes(
|
||||||
response,
|
response,
|
||||||
client: client,
|
|
||||||
onBytesReceived: (int cumulative, int total) {
|
onBytesReceived: (int cumulative, int total) {
|
||||||
records.addAll(<int>[cumulative, total]);
|
records.addAll(<int>[cumulative, total]);
|
||||||
},
|
},
|
||||||
@ -216,6 +207,4 @@ void main() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class MockHttpClient extends Mock implements HttpClient {}
|
|
||||||
class MockHttpClientResponse extends Mock implements HttpClientResponse {}
|
class MockHttpClientResponse extends Mock implements HttpClientResponse {}
|
||||||
class MockHttpHeaders extends Mock implements HttpHeaders {}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user