Commit e340c199 authored by Jonah Williams's avatar Jonah Williams Committed by Flutter GitHub Bot

[flutter_tools] resolve host address in the flutter tool for web server (#48992)

parent da0bfd1c
...@@ -402,7 +402,7 @@ class _ExperimentalResidentWebRunner extends ResidentWebRunner { ...@@ -402,7 +402,7 @@ class _ExperimentalResidentWebRunner extends ResidentWebRunner {
hostPort, hostPort,
packagesFilePath, packagesFilePath,
); );
await device.devFS.create(); final Uri url = await device.devFS.create();
await _updateDevFS(fullRestart: true); await _updateDevFS(fullRestart: true);
device.generator.accept(); device.generator.accept();
await device.device.startApp( await device.device.startApp(
...@@ -410,7 +410,7 @@ class _ExperimentalResidentWebRunner extends ResidentWebRunner { ...@@ -410,7 +410,7 @@ class _ExperimentalResidentWebRunner extends ResidentWebRunner {
mainPath: target, mainPath: target,
debuggingOptions: debuggingOptions, debuggingOptions: debuggingOptions,
platformArgs: <String, Object>{ platformArgs: <String, Object>{
'uri': 'http://$effectiveHostname:$hostPort', 'uri': url.toString(),
}, },
); );
return attach( return attach(
......
...@@ -333,13 +333,17 @@ class WebFs { ...@@ -333,13 +333,17 @@ class WebFs {
Cascade cascade = Cascade(); Cascade cascade = Cascade();
cascade = cascade.add(handler); cascade = cascade.add(handler);
cascade = cascade.add(assetServer.handle); cascade = cascade.add(assetServer.handle);
final HttpServer server = await httpMultiServerFactory(effectiveHostname, hostPort); final InternetAddress internetAddress = (await InternetAddress.lookup(effectiveHostname)).first;
final HttpServer server = await httpMultiServerFactory(internetAddress, hostPort);
shelf_io.serveRequests(server, cascade.handler); shelf_io.serveRequests(server, cascade.handler);
final WebFs webFS = WebFs( final WebFs webFS = WebFs(
client, client,
server, server,
dwds, dwds,
'http://$effectiveHostname:$hostPort/', // Format ipv6 hosts according to RFC 5952.
internetAddress.type == InternetAddressType.IPv4
? '${internetAddress.address}:$hostPort'
: '[${internetAddress.address}]:$hostPort',
assetServer, assetServer,
buildInfo.isDebug, buildInfo.isDebug,
flutterProject, flutterProject,
......
...@@ -28,7 +28,7 @@ import 'bootstrap.dart'; ...@@ -28,7 +28,7 @@ import 'bootstrap.dart';
/// This is only used in development mode. /// This is only used in development mode.
class WebAssetServer { class WebAssetServer {
@visibleForTesting @visibleForTesting
WebAssetServer(this._httpServer, this._packages, WebAssetServer(this._httpServer, this._packages, this.internetAddress,
{@required void Function(dynamic, StackTrace) onError}) { {@required void Function(dynamic, StackTrace) onError}) {
_httpServer.listen((HttpRequest request) { _httpServer.listen((HttpRequest request) {
_handleRequest(request).catchError(onError); _handleRequest(request).catchError(onError);
...@@ -46,10 +46,11 @@ class WebAssetServer { ...@@ -46,10 +46,11 @@ class WebAssetServer {
/// trace. /// trace.
static Future<WebAssetServer> start(String hostname, int port) async { static Future<WebAssetServer> start(String hostname, int port) async {
try { try {
final HttpServer httpServer = await HttpServer.bind(hostname, port); final InternetAddress address = (await InternetAddress.lookup(hostname)).first;
final HttpServer httpServer = await HttpServer.bind(address, port);
final Packages packages = final Packages packages =
await loadPackagesFile(Uri.base.resolve('.packages')); await loadPackagesFile(Uri.base.resolve('.packages'));
return WebAssetServer(httpServer, packages, return WebAssetServer(httpServer, packages, address,
onError: (dynamic error, StackTrace stackTrace) { onError: (dynamic error, StackTrace stackTrace) {
httpServer.close(force: true); httpServer.close(force: true);
throwToolExit( throwToolExit(
...@@ -71,6 +72,7 @@ class WebAssetServer { ...@@ -71,6 +72,7 @@ class WebAssetServer {
final RegExp _drivePath = RegExp(r'\/[A-Z]:\/'); final RegExp _drivePath = RegExp(r'\/[A-Z]:\/');
final Packages _packages; final Packages _packages;
final InternetAddress internetAddress;
// handle requests for JavaScript source, dart sources maps, or asset files. // handle requests for JavaScript source, dart sources maps, or asset files.
Future<void> _handleRequest(HttpRequest request) async { Future<void> _handleRequest(HttpRequest request) async {
...@@ -274,7 +276,13 @@ class WebDevFS implements DevFS { ...@@ -274,7 +276,13 @@ class WebDevFS implements DevFS {
@override @override
Future<Uri> create() async { Future<Uri> create() async {
_webAssetServer = await WebAssetServer.start(hostname, port); _webAssetServer = await WebAssetServer.start(hostname, port);
return Uri.base; final InternetAddress internetAddress = _webAssetServer.internetAddress;
// Format ipv6 hosts according to RFC 5952.
return Uri.parse(
internetAddress.type == InternetAddressType.IPv4
? '${internetAddress.address}:$port'
: '[${internetAddress.address}]:$port'
);
} }
@override @override
......
...@@ -68,7 +68,7 @@ void main() { ...@@ -68,7 +68,7 @@ void main() {
closeCompleter.complete(); closeCompleter.complete();
}); });
webAssetServer = WebAssetServer( webAssetServer = WebAssetServer(
mockHttpServer, packages, onError: (dynamic error, StackTrace stackTrace) { mockHttpServer, packages, InternetAddress.loopbackIPv4, onError: (dynamic error, StackTrace stackTrace) {
closeCompleter.completeError(error, stackTrace); closeCompleter.completeError(error, stackTrace);
}); });
}); });
......
...@@ -32,11 +32,9 @@ void main() { ...@@ -32,11 +32,9 @@ void main() {
MockOperatingSystemUtils mockOperatingSystemUtils; MockOperatingSystemUtils mockOperatingSystemUtils;
MockProcessUtils mockProcessUtils; MockProcessUtils mockProcessUtils;
bool lastInitializePlatform; bool lastInitializePlatform;
dynamic lastAddress;
int lastPort; int lastPort;
setUp(() { setUp(() {
lastAddress = null;
lastPort = null; lastPort = null;
lastInitializePlatform = null; lastInitializePlatform = null;
mockBuildDaemonCreator = MockBuildDaemonCreator(); mockBuildDaemonCreator = MockBuildDaemonCreator();
...@@ -95,7 +93,6 @@ void main() { ...@@ -95,7 +93,6 @@ void main() {
ChromeLauncher: () => mockChromeLauncher, ChromeLauncher: () => mockChromeLauncher,
ProcessUtils: () => mockProcessUtils, ProcessUtils: () => mockProcessUtils,
HttpMultiServerFactory: () => (dynamic address, int port) async { HttpMultiServerFactory: () => (dynamic address, int port) async {
lastAddress = address;
lastPort = port; lastPort = port;
return mockHttpMultiServer; return mockHttpMultiServer;
}, },
...@@ -178,15 +175,17 @@ void main() { ...@@ -178,15 +175,17 @@ void main() {
buildInfo: BuildInfo.debug, buildInfo: BuildInfo.debug,
flutterProject: flutterProject, flutterProject: flutterProject,
initializePlatform: false, initializePlatform: false,
hostname: 'foo', hostname: 'localhost',
port: '1234', port: '1234',
urlTunneller: null, urlTunneller: null,
dartDefines: const <String>[], dartDefines: const <String>[],
); );
expect(webFs.uri, contains('foo:1234')); // Might be either ipv4 or ipv6 for localhost.
final bool hasExpectedUri = webFs.uri.toString().contains('[::1]:1234') ||
webFs.uri.toString().contains('127.0.0.1:1234');
expect(hasExpectedUri, true);
expect(lastPort, 1234); expect(lastPort, 1234);
expect(lastAddress, contains('foo'));
})); }));
test('Throws exception if build fails', () => testbed.run(() async { test('Throws exception if build fails', () => testbed.run(() async {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment