Index: lib/src/browser/html_io.dart |
diff --git a/lib/src/browser/html_io.dart b/lib/src/browser/html_io.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2896967db50e2e7e09c555bab0feb7424087c0fc |
--- /dev/null |
+++ b/lib/src/browser/html_io.dart |
@@ -0,0 +1,60 @@ |
+// Copyright (c) 2016, 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. |
+ |
+import "dart:async" show Future, Stream; |
+import "dart:convert" show Encoding, LATIN1, UTF8; |
+import "dart:html"; |
+import "dart:typed_data" show Uint8List, ByteBuffer; |
+ |
+/// Reads the bytes of a URI as a stream of bytes. |
+Stream<List<int>> readAsStream(Uri uri) async* { |
+ // TODO(lrn): Should file be run through XmlHTTPRequest too? |
+ if (uri.scheme == "http" || uri.scheme == "https") { |
+ // TODO: Stream in chunks if DOM has a way to do so. |
+ List<int> response = await _httpGetBytes(uri); |
+ yield response; |
+ return; |
+ } |
+ if (uri.scheme == "data") { |
+ yield uri.data.contentAsBytes(); |
+ return; |
+ } |
+ throw new UnsupportedError("Unsupported scheme: $uri"); |
+} |
+ |
+/// Reads the bytes of a URI as a list of bytes. |
+Future<List<int>> readAsBytes(Uri uri) async { |
+ if (uri.scheme == "http" || uri.scheme == "https") { |
+ return _httpGetBytes(uri); |
+ } |
+ if (uri.scheme == "data") { |
+ return uri.data.contentAsBytes(); |
+ } |
+ throw new UnsupportedError("Unsupported scheme: $uri"); |
+} |
+ |
+/// Reads the bytes of a URI as a string. |
+Future<String> readAsString(Uri uri, Encoding encoding) async { |
+ if (uri.scheme == "http" || uri.scheme == "https") { |
+ // Fetch as string if the encoding is expected to be understood, |
+ // otherwise fetch as bytes and do decoding using the encoding. |
+ if (encoding != null) { |
+ return encoding.decode(await _httpGetBytes(uri)); |
+ } |
+ return HttpRequest.getString(uri.toString()); |
+ } |
+ if (uri.scheme == "data") { |
+ return uri.data.contentAsString(encoding: encoding); |
+ } |
+ throw new UnsupportedError("Unsupported scheme: $uri"); |
+} |
+ |
+Future<List<int>> _httpGetBytes(Uri uri) { |
+ return HttpRequest |
+ .request(uri.toString(), responseType: "arraybuffer") |
+ .then((request) { |
+ ByteBuffer data = request.response; |
+ return data.asUint8List(); |
+ }); |
+} |