From 2aa90166527db7081483684e61252ef6d20d7483 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 27 Apr 2020 15:02:15 -0700 Subject: [PATCH] [flutter_tools] ensure etag headers are ascii (#55704) --- .../lib/src/build_runner/devfs_web.dart | 3 ++- .../test/general.shard/web/devfs_web_test.dart | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/build_runner/devfs_web.dart b/packages/flutter_tools/lib/src/build_runner/devfs_web.dart index 3c578b3da25..6c115303334 100644 --- a/packages/flutter_tools/lib/src/build_runner/devfs_web.dart +++ b/packages/flutter_tools/lib/src/build_runner/devfs_web.dart @@ -350,7 +350,8 @@ class WebAssetServer implements AssetReader { // For real files, use a serialized file stat plus path as a revision. // This allows us to update between canvaskit and non-canvaskit SDKs. - final String etag = file.lastModifiedSync().toIso8601String() + file.path; + final String etag = file.lastModifiedSync().toIso8601String() + + Uri.encodeComponent(file.path); if (ifNoneMatch == etag) { return shelf.Response.notModified(); } 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 63ccf34d464..9e489fb5b20 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 @@ -324,6 +324,18 @@ void main() { expect((await response.read().toList()).first, source.readAsBytesSync()); })); + test('serves valid etag header for asset files with non-ascii chracters', () => testbed.run(() async { + 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π'))); + final String etag = response.headers[HttpHeaders.etagHeader]; + + expect(etag.runes, everyElement(predicate((int char) => char < 255))); + })); + test('handles serving missing asset file', () => testbed.run(() async { final Response response = await webAssetServer .handleRequest(Request('GET', Uri.parse('http://foobar/assets/foo')));