Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ class _ResidentWebRunner extends ResidentWebRunner {
urlTunneller: urlTunneller,
buildMode: debuggingOptions.buildInfo.mode,
enableDwds: _enableDwds,
entrypoint: globals.fs.file(target).uri,
);
final Uri url = await device.devFS.create();
if (debuggingOptions.buildInfo.isDebug) {
Expand Down
31 changes: 21 additions & 10 deletions packages/flutter_tools/lib/src/web/devfs_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class WebAssetServer implements AssetReader {
UrlTunneller urlTunneller,
BuildMode buildMode,
bool enableDwds,
Uri entrypoint,
) async {
try {
final InternetAddress address = (await InternetAddress.lookup(hostname)).first;
Expand All @@ -63,7 +64,7 @@ class WebAssetServer implements AssetReader {

// In release builds deploy a simpler proxy server.
if (buildMode != BuildMode.debug) {
final ReleaseAssetServer releaseAssetServer = ReleaseAssetServer();
final ReleaseAssetServer releaseAssetServer = ReleaseAssetServer(entrypoint);
shelf.serveRequests(httpServer, releaseAssetServer.handle);
return server;
}
Expand Down Expand Up @@ -318,8 +319,10 @@ class WebDevFS implements DevFS {
@required this.urlTunneller,
@required this.buildMode,
@required this.enableDwds,
@required this.entrypoint,
});

final Uri entrypoint;
final String hostname;
final int port;
final String packagesFilePath;
Expand Down Expand Up @@ -385,6 +388,7 @@ class WebDevFS implements DevFS {
urlTunneller,
buildMode,
enableDwds,
entrypoint,
);
return Uri.parse('http://$hostname:$port');
}
Expand Down Expand Up @@ -552,24 +556,31 @@ String _filePathToUriFragment(String path) {
}

class ReleaseAssetServer {
ReleaseAssetServer(this.entrypoint);

final Uri entrypoint;

// Locations where source files, assets, or source maps may be located.
final List<Uri> _searchPaths = <Uri>[
globals.fs.directory(getWebBuildDirectory()).uri,
globals.fs.directory(Cache.flutterRoot).parent.uri,
globals.fs.currentDirectory.childDirectory('lib').uri,
globals.fs.directory(Cache.flutterRoot).uri,
globals.fs.currentDirectory.uri,
];

Future<shelf.Response> handle(shelf.Request request) async {
Uri fileUri;
for (final Uri uri in _searchPaths) {
final Uri potential = uri.resolve(request.url.path);
if (potential == null || !globals.fs.isFileSync(potential.toFilePath())) {
continue;
if (request.url.toString() == 'main.dart') {
fileUri = entrypoint;
} else {
for (final Uri uri in _searchPaths) {
final Uri potential = uri.resolve(request.url.path);
if (potential == null || !globals.fs.isFileSync(potential.toFilePath())) {
continue;
}
fileUri = potential;
break;
}
fileUri = potential;
break;
}

if (fileUri != null) {
final File file = globals.fs.file(fileUri);
final Uint8List bytes = file.readAsBytesSync();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@ void main() {
urlTunneller: null,
buildMode: BuildMode.debug,
enableDwds: false,
entrypoint: Uri.base,
);
webDevFS.requireJS.createSync(recursive: true);
webDevFS.dartSdk.createSync(recursive: true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ void main() {
});

test('release asset server serves correct mime type and content length for png', () => testbed.run(() async {
final ReleaseAssetServer assetServer = ReleaseAssetServer();
final ReleaseAssetServer assetServer = ReleaseAssetServer(Uri.base);
globals.fs.file(globals.fs.path.join('build', 'web', 'assets', 'foo.png'))
..createSync(recursive: true)
..writeAsBytesSync(kTransparentImage);
Expand All @@ -54,7 +54,7 @@ void main() {
}));

test('release asset server serves correct mime type and content length for JavaScript', () => testbed.run(() async {
final ReleaseAssetServer assetServer = ReleaseAssetServer();
final ReleaseAssetServer assetServer = ReleaseAssetServer(Uri.base);
globals.fs.file(globals.fs.path.join('build', 'web', 'assets', 'foo.js'))
..createSync(recursive: true)
..writeAsStringSync('function main() {}');
Expand All @@ -68,7 +68,7 @@ void main() {
}));

test('release asset server serves correct mime type and content length for html', () => testbed.run(() async {
final ReleaseAssetServer assetServer = ReleaseAssetServer();
final ReleaseAssetServer assetServer = ReleaseAssetServer(Uri.base);
globals.fs.file(globals.fs.path.join('build', 'web', 'assets', 'foo.html'))
..createSync(recursive: true)
..writeAsStringSync('<!doctype html><html></html>');
Expand All @@ -82,7 +82,7 @@ void main() {
}));

test('release asset server serves content from flutter root', () => testbed.run(() async {
final ReleaseAssetServer assetServer = ReleaseAssetServer();
final ReleaseAssetServer assetServer = ReleaseAssetServer(Uri.base);
globals.fs.file(globals.fs.path.join('flutter', 'bar.dart'))
..createSync(recursive: true)
..writeAsStringSync('void main() { }');
Expand All @@ -93,13 +93,13 @@ void main() {
}));

test('release asset server serves content from project directory', () => testbed.run(() async {
final ReleaseAssetServer assetServer = ReleaseAssetServer();
globals.fs.file(globals.fs.path.join('lib', 'bar.dart'))
final ReleaseAssetServer assetServer = ReleaseAssetServer(Uri.base);
globals.fs.file(globals.fs.path.join('bar.dart'))
..createSync(recursive: true)
..writeAsStringSync('void main() { }');
final Response response = await assetServer
.handle(Request('GET', Uri.parse('http://localhost:8080/bar.dart')));

expect(response.statusCode, HttpStatus.ok);
}));
}
}