From 2a4e573dcdf5455ebdf0a2b3541e190021a649f1 Mon Sep 17 00:00:00 2001 From: Sergey Fedotov Date: Wed, 8 Dec 2021 23:29:07 +0300 Subject: [PATCH] Serve assets with correct content-type header value (#94357) --- .../lib/src/isolated/devfs_web.dart | 11 +++---- .../general.shard/web/devfs_web_test.dart | 33 +++++++++---------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index 1d5b3d4a17d..e9fd1d07b68 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -455,14 +455,11 @@ class WebAssetServer implements AssetReader { // Attempt to determine the file's mime type. if this is not provided some // browsers will refuse to render images/show video etc. If the tool // cannot determine a mime type, fall back to application/octet-stream. - String mimeType; - if (length >= 12) { - mimeType = mime.lookupMimeType( + final String mimeType = mime.lookupMimeType( file.path, - headerBytes: await file.openRead(0, 12).first, - ); - } - mimeType ??= _kDefaultMimeType; + headerBytes: await file.openRead(0, mime.defaultMagicNumbersMaxLength).first, + ) ?? _kDefaultMimeType; + headers[HttpHeaders.contentLengthHeader] = length.toString(); headers[HttpHeaders.contentTypeHeader] = mimeType; headers[HttpHeaders.etagHeader] = etag; diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index 9dfd5aa3cf9..b9b4e192ad3 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -539,7 +539,21 @@ void main() { expect((await response.read().toList()).first, source.readAsBytesSync()); })); - test('serves asset files files from in filesystem with unknown mime type and length > 12', () => testbed.run(() async { + test('serves asset files from in filesystem with known mime type and empty content', () => testbed.run(() async { + final File source = globals.fs.file(globals.fs.path.join('web', 'foo.js')) + ..createSync(recursive: true); + + final Response response = await webAssetServer + .handleRequest(Request('GET', Uri.parse('http://foobar/foo.js'))); + + expect(response.headers, allOf([ + containsPair(HttpHeaders.contentLengthHeader, '0'), + containsPair(HttpHeaders.contentTypeHeader, 'application/javascript'), + ])); + expect((await response.read().toList()).first, source.readAsBytesSync()); + })); + + test('serves asset files files from in filesystem with unknown mime type', () => testbed.run(() async { final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo')) ..createSync(recursive: true) ..writeAsBytesSync(List.filled(100, 0)); @@ -554,21 +568,6 @@ void main() { expect((await response.read().toList()).first, source.readAsBytesSync()); })); - test('serves asset files files from in filesystem with unknown mime type and length < 12', () => testbed.run(() async { - final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo')) - ..createSync(recursive: true) - ..writeAsBytesSync([1, 2, 3]); - - final Response response = await webAssetServer - .handleRequest(Request('GET', Uri.parse('http://foobar/assets/foo'))); - - expect(response.headers, allOf([ - containsPair(HttpHeaders.contentLengthHeader, '3'), - containsPair(HttpHeaders.contentTypeHeader, 'application/octet-stream'), - ])); - expect((await response.read().toList()).first, source.readAsBytesSync()); - })); - test('serves valid etag header for asset files with non-ascii characters', () => testbed.run(() async { globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'fooπ')) ..createSync(recursive: true) @@ -594,7 +593,7 @@ void main() { expect(response.headers, allOf([ containsPair(HttpHeaders.contentLengthHeader, '3'), - containsPair(HttpHeaders.contentTypeHeader, 'application/octet-stream'), + containsPair(HttpHeaders.contentTypeHeader, 'text/x-dart'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); }));