From e979e166d6130eed3f09f90c8cb89ed2b0751370 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 6 Nov 2025 13:01:18 -0800 Subject: [PATCH] [tool] Fix IP parsing by using Uri constructor (#178083) Also DRY'd up use of `"any"` constant is several places. Fixes https://github.com/flutter/flutter/issues/178082 --- .../lib/src/isolated/web_asset_server.dart | 21 ++++++++++--------- .../lib/src/web/devfs_config.dart | 9 ++++++-- .../general.shard/web/devfs_web_test.dart | 3 +++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/flutter_tools/lib/src/isolated/web_asset_server.dart b/packages/flutter_tools/lib/src/isolated/web_asset_server.dart index aef052bd5bd..971eca0acc6 100644 --- a/packages/flutter_tools/lib/src/isolated/web_asset_server.dart +++ b/packages/flutter_tools/lib/src/isolated/web_asset_server.dart @@ -207,8 +207,8 @@ class WebAssetServer implements AssetReader { if (ddcModuleSystem) { assert(canaryFeatures); } - InternetAddress address; - if (hostname == 'any') { + final InternetAddress address; + if (hostname == webDevAnyHostDefault) { address = InternetAddress.anyIPv4; } else { address = (await InternetAddress.lookup(hostname)).first; @@ -258,14 +258,15 @@ class WebAssetServer implements AssetReader { fileSystem: fileSystem, ); final int selectedPort = server.selectedPort; - var url = '$hostname:$selectedPort'; - if (hostname == 'any') { - url = 'localhost:$selectedPort'; - } - server._baseUri = Uri.http(url, server.basePath); - if (tlsCertPath != null && tlsCertKeyPath != null) { - server._baseUri = Uri.https(url, server.basePath); - } + + final cleanHost = hostname == webDevAnyHostDefault ? 'localhost' : hostname; + final scheme = tlsCertPath != null && tlsCertKeyPath != null ? 'https' : 'http'; + server._baseUri = Uri( + scheme: scheme, + host: cleanHost, + port: selectedPort, + path: server.basePath, + ); if (testMode) { return server; } diff --git a/packages/flutter_tools/lib/src/web/devfs_config.dart b/packages/flutter_tools/lib/src/web/devfs_config.dart index 032153efdb2..abcfad477ab 100644 --- a/packages/flutter_tools/lib/src/web/devfs_config.dart +++ b/packages/flutter_tools/lib/src/web/devfs_config.dart @@ -14,6 +14,11 @@ import '../base/os.dart'; import 'devfs_proxy.dart'; const webDevServerConfigFilePath = 'web_dev_config.yaml'; + +/// Represents the default value for the web dev server. +/// +/// Maps to `localhost` and/or `127.0.0.1`. +const webDevAnyHostDefault = 'any'; const _kLogEntryPrefix = '[WebDevServer]'; const _kServer = 'server'; const _kName = 'name'; @@ -41,7 +46,7 @@ T? _validateType({required Object? value, required String fieldName}) { class WebDevServerConfig { const WebDevServerConfig({ this.headers = const {}, - this.host = 'any', + this.host = webDevAnyHostDefault, this.port = 0, this.https, this.proxy = const [], @@ -97,7 +102,7 @@ class WebDevServerConfig { return WebDevServerConfig( headers: headers, - host: host ?? 'any', + host: host ?? webDevAnyHostDefault, port: port ?? 0, https: https == null ? null : HttpsConfig.fromYaml(https), proxy: proxyRules, 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 58110cac8b9..c3ef72a276f 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 @@ -1308,6 +1308,7 @@ void main() { final String dummyCertPath = globals.fs.path.join(dataPath, 'tls_cert', 'dummy-cert.pem'); final String dummyCertKeyPath = globals.fs.path.join(dataPath, 'tls_cert', 'dummy-key.pem'); final webDevServerConfig = WebDevServerConfig( + host: '::1', https: HttpsConfig(certPath: dummyCertPath, certKeyPath: dummyCertKeyPath), ); final webDevFS = WebDevFS( @@ -1341,6 +1342,8 @@ void main() { // Ensure the connection established is secure expect(uri.scheme, 'https'); + // Ensure that the host correctly support IPv6 + expect(uri.host, '::1'); await webDevFS.destroy(); }, overrides: {Artifacts: () => Artifacts.test()}),