| 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();
|
| +}
|
|
|