| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| import 'dart:typed_data'; |
| |
| /// Efficiently converts the response body of an [HttpClientResponse] into a [Uint8List]. |
| /// |
| /// The future returned will forward all errors emitted by [response]. |
| Future<Uint8List> consolidateHttpClientResponseBytes(HttpClientResponse response) { |
| // response.contentLength is not trustworthy when GZIP is involved |
| // or other cases where an intermediate transformer has been applied |
| // to the stream. |
| final Completer<Uint8List> completer = Completer<Uint8List>.sync(); |
| final List<List<int>> chunks = <List<int>>[]; |
| int contentLength = 0; |
| response.listen((List<int> chunk) { |
| chunks.add(chunk); |
| contentLength += chunk.length; |
| }, onDone: () { |
| final Uint8List bytes = Uint8List(contentLength); |
| int offset = 0; |
| for (List<int> chunk in chunks) { |
| bytes.setRange(offset, offset + chunk.length, chunk); |
| offset += chunk.length; |
| } |
| completer.complete(bytes); |
| }, onError: completer.completeError, cancelOnError: true); |
| |
| return completer.future; |
| } |