// Copyright 2015 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 '../globals.dart';
import 'common.dart';
import 'io.dart';

const int kNetworkProblemExitCode = 50;

/// Download a file from the given URL and return the bytes.
Future<List<int>> fetchUrl(Uri url) async {
  printTrace('Downloading $url.');

  HttpClient httpClient = new HttpClient();
  HttpClientRequest request = await httpClient.getUrl(url);
  HttpClientResponse response = await request.close();

  printTrace('Received response statusCode=${response.statusCode}');
  if (response.statusCode != 200) {
    throwToolExit(
      'Download failed: $url\n'
          '  because (${response.statusCode}) ${response.reasonPhrase}',
      exitCode: kNetworkProblemExitCode,
    );
  }

  try {
    BytesBuilder responseBody = new BytesBuilder(copy: false);
    await for (List<int> chunk in response)
        responseBody.add(chunk);

    return responseBody.takeBytes();
  } on IOException catch (e) {
    throw new ToolExit(
      'Download failed: $url\n  $e',
      exitCode: kNetworkProblemExitCode,
    );
  }
}