loadHttp function

Future<File> loadHttp(
  1. Uri uri,
  2. File save, {
  3. Map<String, Object>? headers,
  4. ProgressListener? listener,
})

Implementation

Future<File> loadHttp(
  Uri uri,
  File save, {
  Map<String, Object>? headers,
  ProgressListener? listener,
}) async {
  late HttpClient client;
  IOSink? sink;
  try {
    client = HttpClient();
    final request = await client.getUrl(uri);
    headers?.forEach((key, value) => request.headers.add(key, value));
    final response = await request.close();
    final code = response.statusCode;
    if (code != HttpStatus.ok) {
      throw HttpException(
        'statusCode=$code, message=${response.reasonPhrase}',
        uri: uri,
      );
    }
    sink = save.openWrite();
    final total = response.contentLength;
    var cached = 0, percent = 0, newPercent = 0;
    await for (var bytes in response) {
      sink.add(bytes);
      if (listener == null || total <= 0) continue;
      cached += bytes.length;
      newPercent = cached * 100 ~/ total;
      if (newPercent > percent) {
        percent = newPercent;
        listener(total, cached, percent);
      }
    }
    await sink.flush();
    return save;
  } finally {
    await sink?.close();
    client.close();
  }
}