diff --git a/lib/src/io_io.dart b/lib/src/io_io.dart index 0450651..03cc92e 100644 --- a/lib/src/io_io.dart +++ b/lib/src/io_io.dart @@ -4,13 +4,15 @@ import "dart:async" show Future, Stream; import "dart:convert" show Encoding, LATIN1, UTF8; -import "dart:io" show File, - HttpStatus, - HttpClient, - HttpClientResponse, - HttpClientRequest, - HttpException, - HttpHeaders; +import "dart:io" + show + File, + HttpStatus, + HttpClient, + HttpClientResponse, + HttpClientRequest, + HttpException, + HttpHeaders; import "package:typed_data/typed_buffers.dart" show Uint8Buffer; @@ -43,7 +45,8 @@ Future> readAsBytes(Uri uri) async { _throwIfFailed(response, uri); int length = response.contentLength; if (length < 0) length = 0; - var buffer = new Uint8Buffer(length); + // Create empty buffer with capacity matching contentLength. + var buffer = new Uint8Buffer(length)..length = 0; await for (var bytes in response) { buffer.addAll(bytes); } diff --git a/test/loader_http_test.dart b/test/loader_http_test.dart index 155613e..f86e417 100644 --- a/test/loader_http_test.dart +++ b/test/loader_http_test.dart @@ -31,10 +31,12 @@ main() { request.response.headers.contentType = new ContentType("text", "plain", charset: encoding.name); if (request.uri.query.contains("length")) { - request.response.headers.contentLength = content.length; + request.response.headers.contentLength = + encoding.encode(content).length; } - request.response..write(content) - ..close(); + request.response + ..write(content) + ..close(); }).catchError(print); }); @@ -53,12 +55,19 @@ main() { test("Latin-1 encoding w/ length", () async { // Regression test for issue #21. var loader = ResourceLoader.defaultLoader; - var newUri = uri.replace(query: "length"); // Request length set. + var newUri = uri.replace(query: "length"); // Request length set. String string = await loader.readAsString(newUri, encoding: LATIN1); expect(string, content); }); test("UTF-8 encoding", () async { + var loader = ResourceLoader.defaultLoader; + var newUri = uri.replace(query: "length"); // Request length set. + String string = await loader.readAsString(newUri, encoding: UTF8); + expect(string, content); + }); + + test("UTF-8 encoding w/ length", () async { var loader = ResourceLoader.defaultLoader; String string = await loader.readAsString(uri, encoding: UTF8); expect(string, content); @@ -66,13 +75,20 @@ main() { test("bytes", () async { var loader = ResourceLoader.defaultLoader; - List bytes = await loader.readAsBytes(uri); // Sender uses Latin-1. + List bytes = await loader.readAsBytes(uri); // Sender uses Latin-1. + expect(bytes, content.codeUnits); + }); + + test("bytes w/ length", () async { + var loader = ResourceLoader.defaultLoader; + var newUri = uri.replace(query: "length"); // Request length set. + List bytes = await loader.readAsBytes(newUri); // Sender uses Latin-1. expect(bytes, content.codeUnits); }); test("byte stream", () async { var loader = ResourceLoader.defaultLoader; - var bytes = loader.openRead(uri); // Sender uses Latin-1. + var bytes = loader.openRead(uri); // Sender uses Latin-1. var buffer = []; await bytes.forEach(buffer.addAll); expect(buffer, content.codeUnits); @@ -80,20 +96,20 @@ main() { test("not found - String", () async { var loader = ResourceLoader.defaultLoader; - var badUri = uri.resolve("file.not"); // .not makes server fail. - expect(loader.readAsString(badUri), throws); + var badUri = uri.resolve("file.not"); // .not makes server fail. + expect(loader.readAsString(badUri), throwsException); }); test("not found - bytes", () async { var loader = ResourceLoader.defaultLoader; - var badUri = uri.resolve("file.not"); // .not makes server fail. - expect(loader.readAsBytes(badUri), throws); + var badUri = uri.resolve("file.not"); // .not makes server fail. + expect(loader.readAsBytes(badUri), throwsException); }); test("not found - byte stream", () async { var loader = ResourceLoader.defaultLoader; - var badUri = uri.resolve("file.not"); // .not makes server fail. - expect(loader.openRead(badUri).length, throws); + var badUri = uri.resolve("file.not"); // .not makes server fail. + expect(loader.openRead(badUri).length, throwsException); }); tearDown(() { @@ -102,7 +118,6 @@ main() { }); } - Encoding parseAcceptCharset(List headers) { var encoding = LATIN1; if (headers != null) {