| Index: lib/src/io.dart
 | 
| diff --git a/lib/src/io.dart b/lib/src/io.dart
 | 
| index 8237c0160f1493fb74e905797e4e8a3c5add4280..ba137962167a922709b62e2a01d8875ff00af62c 100644
 | 
| --- a/lib/src/io.dart
 | 
| +++ b/lib/src/io.dart
 | 
| @@ -1,59 +1,90 @@
 | 
| -// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 | 
| -// for details. All rights reserved. Use of this source code is governed by a
 | 
| -// BSD-style license that can be found in the LICENSE file.
 | 
| -
 | 
| -// dart:io based strategy for loading resources.
 | 
| -
 | 
| -import "dart:io" show File, HttpClient, HttpClientRequest, HttpClientResponse;
 | 
| -import "dart:async" show Future, Stream;
 | 
| -import "dart:convert" show Encoding, UTF8;
 | 
| -import "package:typed_data/typed_buffers.dart" show Uint8Buffer;
 | 
| -
 | 
| -Stream<List<int>> readAsStream(Uri uri) async* {
 | 
| -  if (uri.scheme == "file") {
 | 
| -    yield* new File.fromUri(uri).openRead();
 | 
| -    return;
 | 
| -  }
 | 
| -  if (uri.scheme == "http" || uri.scheme == "https") {
 | 
| -    HttpClientResponse response = await _httpGet(uri);
 | 
| -    yield* response;
 | 
| -    return;
 | 
| -  }
 | 
| -  throw new UnsupportedError("Unsupported scheme: $uri");
 | 
| -}
 | 
| -
 | 
| -Future<List<int>> readAsBytes(Uri uri) async {
 | 
| -  if (uri.scheme == "file") {
 | 
| -    return new File.fromUri(uri).readAsBytes();
 | 
| -  }
 | 
| -  if (uri.scheme == "http" || uri.scheme == "https") {
 | 
| -    HttpClientResponse response = await _httpGet(uri);
 | 
| -    Uint8Buffer buffer = new Uint8Buffer();
 | 
| -    await for (var bytes in response) {
 | 
| -      buffer.addAll(bytes);
 | 
| -    }
 | 
| -    return buffer.toList();
 | 
| -  }
 | 
| -  throw new UnsupportedError("Unsupported scheme: $uri");
 | 
| -}
 | 
| -
 | 
| -Future<String> readAsString(Uri uri, Encoding encoding) async {
 | 
| -  if (encoding == null) encoding = UTF8;
 | 
| -  if (uri.scheme == "file") {
 | 
| -    return new File.fromUri(uri).readAsString(encoding: encoding);
 | 
| -  }
 | 
| -  if (uri.scheme == "http" || uri.scheme == "https") {
 | 
| -    HttpClientResponse response = await _httpGet(uri);
 | 
| -    Uint8Buffer buffer = new Uint8Buffer();
 | 
| -    await for (var bytes in response) {
 | 
| -      buffer.addAll(bytes);
 | 
| -    }
 | 
| -    new String.fromCharCodes(buffer.toList());
 | 
| -  }
 | 
| -  throw new UnsupportedError("Unsupported scheme: $uri");
 | 
| -}
 | 
| -
 | 
| -Future<HttpClientResponse> _httpGet(Uri uri) async {
 | 
| -  HttpClientRequest request = await new HttpClient().getUrl(uri);
 | 
| -  return await request.close();
 | 
| -}
 | 
| +// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 | 
| +// for details. All rights reserved. Use of this source code is governed by a
 | 
| +// BSD-style license that can be found in the LICENSE file.
 | 
| +
 | 
| +// dart:io based strategy for loading resources.
 | 
| +
 | 
| +import "dart:async" show Future, Stream;
 | 
| +import "dart:convert" show Encoding, LATIN1, UTF8;
 | 
| +import "dart:io" show
 | 
| +    File, HttpClient, HttpClientResponse, HttpClientRequest, HttpHeaders;
 | 
| +import "dart:typed_data" show Uint8List;
 | 
| +import "package:typed_data/typed_buffers.dart" show Uint8Buffer;
 | 
| +
 | 
| +/// Read the bytes of a URI as a stream of bytes.
 | 
| +Stream<List<int>> readAsStream(Uri uri) async* {
 | 
| +  if (uri.scheme == "file") {
 | 
| +    yield* new File.fromUri(uri).openRead();
 | 
| +    return;
 | 
| +  }
 | 
| +  if (uri.scheme == "http" || uri.scheme == "https") {
 | 
| +    HttpClientResponse response = await _httpGet(uri);
 | 
| +    yield* response;
 | 
| +    return;
 | 
| +  }
 | 
| +  if (uri.scheme == "data") {
 | 
| +    yield uri.data.contentAsBytes();
 | 
| +    return;
 | 
| +  }
 | 
| +  throw new UnsupportedError("Unsupported scheme: $uri");
 | 
| +}
 | 
| +
 | 
| +/// Read the bytes of a URI as a list of bytes.
 | 
| +Future<List<int>> readAsBytes(Uri uri) async {
 | 
| +  if (uri.scheme == "file") {
 | 
| +    return new File.fromUri(uri).readAsBytes();
 | 
| +  }
 | 
| +  if (uri.scheme == "http" || uri.scheme == "https") {
 | 
| +    HttpClientResponse response = await _httpGet(uri);
 | 
| +    Uint8Buffer buffer = new Uint8Buffer();
 | 
| +    await for (var bytes in response) {
 | 
| +      buffer.addAll(bytes);
 | 
| +    }
 | 
| +    return buffer.toList();
 | 
| +  }
 | 
| +  if (uri.scheme == "data") {
 | 
| +    return uri.data.contentAsBytes();
 | 
| +  }
 | 
| +  throw new UnsupportedError("Unsupported scheme: $uri");
 | 
| +}
 | 
| +
 | 
| +/// Read the bytes of a URI as a string.
 | 
| +Future<String> readAsString(Uri uri, Encoding encoding) async {
 | 
| +  if (uri.scheme == "file") {
 | 
| +    if (encoding == null) encoding = UTF8;
 | 
| +    return new File.fromUri(uri).readAsString(encoding: encoding);
 | 
| +  }
 | 
| +  if (uri.scheme == "http" || uri.scheme == "https") {
 | 
| +    HttpClientRequest request = await new HttpClient().getUrl(uri);
 | 
| +    // Prefer text/plain, text/* if possible, otherwise take whatever is there.
 | 
| +    request.headers.set(HttpHeaders.ACCEPT, "text/plain, text/*, */*");
 | 
| +    if (encoding != null) {
 | 
| +      request.headers.set(HttpHeaders.ACCEPT_CHARSET, encoding.name);
 | 
| +    }
 | 
| +    HttpClientResponse response = await request.close();
 | 
| +    encoding ??= Encoding.getByName(response.headers.contentType?.charset);
 | 
| +    if (encoding == null || encoding == LATIN1) {
 | 
| +      // Default to LATIN-1 if no encoding found.
 | 
| +      // Special case LATIN-1 since it is common and doesn't need decoding.
 | 
| +      int length = response.contentLength;
 | 
| +      if (length < 0) length = 0;
 | 
| +      Uint8Buffer buffer = new Uint8Buffer(length);
 | 
| +      await for (var bytes in response) {
 | 
| +        buffer.addAll(bytes);
 | 
| +      }
 | 
| +      var byteList = new Uint8List.view(buffer.buffer, 0, buffer.length);
 | 
| +      return new String.fromCharCodes(byteList);
 | 
| +    }
 | 
| +    return response.transform(encoding.decoder).join();
 | 
| +  }
 | 
| +  if (uri.scheme == "data") {
 | 
| +    return uri.data.contentAsString(encoding: encoding);
 | 
| +  }
 | 
| +  throw new UnsupportedError("Unsupported scheme: $uri");
 | 
| +}
 | 
| +
 | 
| +Future<HttpClientResponse> _httpGet(Uri uri) async {
 | 
| +  HttpClientRequest request = await new HttpClient().getUrl(uri);
 | 
| +    request.headers.set(HttpHeaders.ACCEPT, "application/octet-stream, */*");
 | 
| +  return request.close();
 | 
| +}
 | 
| 
 |