[flutter_tools] resolve host address in the flutter tool for web server (#48992)
This commit is contained in:
parent
da0bfd1c93
commit
e340c19905
@ -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 {
|
|||||||
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 {
|
|||||||
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';
|
|||||||
/// 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 {
|
|||||||
/// 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 {
|
|||||||
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 {
|
|||||||
@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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user