Unverified Commit 66e6acbe authored by Andrew Kolos's avatar Andrew Kolos Committed by GitHub

throw `ToolExit` when `--web-port` is an integer outside the valid TCP port range (#123269)

throw `ToolExit` when `--web-port` is an integer outside the valid TCP port range
parent be008aef
...@@ -179,7 +179,7 @@ class WebAssetServer implements AssetReader { ...@@ -179,7 +179,7 @@ class WebAssetServer implements AssetReader {
static Future<WebAssetServer> start( static Future<WebAssetServer> start(
ChromiumLauncher? chromiumLauncher, ChromiumLauncher? chromiumLauncher,
String hostname, String hostname,
int? port, int port,
UrlTunneller? urlTunneller, UrlTunneller? urlTunneller,
bool useSseForDebugProxy, bool useSseForDebugProxy,
bool useSseForDebugBackend, bool useSseForDebugBackend,
...@@ -203,7 +203,7 @@ class WebAssetServer implements AssetReader { ...@@ -203,7 +203,7 @@ class WebAssetServer implements AssetReader {
const int kMaxRetries = 4; const int kMaxRetries = 4;
for (int i = 0; i <= kMaxRetries; i++) { for (int i = 0; i <= kMaxRetries; i++) {
try { try {
httpServer = await HttpServer.bind(address, port ?? await globals.os.findFreePort()); httpServer = await HttpServer.bind(address, port);
break; break;
} on SocketException catch (e, s) { } on SocketException catch (e, s) {
if (i >= kMaxRetries) { if (i >= kMaxRetries) {
...@@ -638,7 +638,7 @@ class WebDevFS implements DevFS { ...@@ -638,7 +638,7 @@ class WebDevFS implements DevFS {
/// server. /// server.
WebDevFS({ WebDevFS({
required this.hostname, required this.hostname,
required int? port, required int port,
required this.packagesFilePath, required this.packagesFilePath,
required this.urlTunneller, required this.urlTunneller,
required this.useSseForDebugProxy, required this.useSseForDebugProxy,
...@@ -671,7 +671,7 @@ class WebDevFS implements DevFS { ...@@ -671,7 +671,7 @@ class WebDevFS implements DevFS {
final ChromiumLauncher? chromiumLauncher; final ChromiumLauncher? chromiumLauncher;
final bool nullAssertions; final bool nullAssertions;
final bool nativeNullAssertions; final bool nativeNullAssertions;
final int? _port; final int _port;
final NullSafetyMode nullSafetyMode; final NullSafetyMode nullSafetyMode;
late WebAssetServer webAssetServer; late WebAssetServer webAssetServer;
......
...@@ -28,6 +28,7 @@ import '../dart/language_version.dart'; ...@@ -28,6 +28,7 @@ import '../dart/language_version.dart';
import '../devfs.dart'; import '../devfs.dart';
import '../device.dart'; import '../device.dart';
import '../flutter_plugins.dart'; import '../flutter_plugins.dart';
import '../globals.dart' as globals;
import '../project.dart'; import '../project.dart';
import '../reporting/reporting.dart'; import '../reporting/reporting.dart';
import '../resident_devtools_handler.dart'; import '../resident_devtools_handler.dart';
...@@ -254,15 +255,38 @@ class ResidentWebRunner extends ResidentRunner { ...@@ -254,15 +255,38 @@ class ResidentWebRunner extends ResidentRunner {
try { try {
return await asyncGuard(() async { return await asyncGuard(() async {
Future<int> getPort() async {
if (debuggingOptions.port == null) {
return globals.os.findFreePort();
}
final int? port = int.tryParse(debuggingOptions.port ?? '');
if (port == null) {
logger.printError('''
Received a non-integer value for port: ${debuggingOptions.port}
A randomly-chosen available port will be used instead.
''');
return globals.os.findFreePort();
}
if (port < 0 || port > 65535) {
throwToolExit('''
Invalid port: ${debuggingOptions.port}
Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
''');
}
return port;
}
final ExpressionCompiler? expressionCompiler = final ExpressionCompiler? expressionCompiler =
debuggingOptions.webEnableExpressionEvaluation debuggingOptions.webEnableExpressionEvaluation
? WebExpressionCompiler(device!.generator!, fileSystem: _fileSystem) ? WebExpressionCompiler(device!.generator!, fileSystem: _fileSystem)
: null; : null;
device!.devFS = WebDevFS( device!.devFS = WebDevFS(
hostname: debuggingOptions.hostname ?? 'localhost', hostname: debuggingOptions.hostname ?? 'localhost',
port: debuggingOptions.port != null port: await getPort(),
? int.tryParse(debuggingOptions.port!)
: null,
packagesFilePath: packagesFilePath, packagesFilePath: packagesFilePath,
urlTunneller: _urlTunneller, urlTunneller: _urlTunneller,
useSseForDebugProxy: debuggingOptions.webUseSseForDebugProxy, useSseForDebugProxy: debuggingOptions.webUseSseForDebugProxy,
......
...@@ -1311,6 +1311,23 @@ flutter: ...@@ -1311,6 +1311,23 @@ flutter:
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('throws when port is an integer outside the valid TCP range', () async {
final BufferLogger logger = BufferLogger.test();
DebuggingOptions debuggingOptions = DebuggingOptions.enabled(BuildInfo.debug, port: '65536');
ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger, debuggingOptions: debuggingOptions);
await expectToolExitLater(residentWebRunner.run(), matches('Invalid port: 65536.*'));
debuggingOptions = DebuggingOptions.enabled(BuildInfo.debug, port: '-1');
residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger, debuggingOptions: debuggingOptions);
await expectToolExitLater(residentWebRunner.run(), matches('Invalid port: -1.*'));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
});
} }
ResidentRunner setUpResidentRunner( ResidentRunner setUpResidentRunner(
......
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