diff --git a/packages/flutter_tools/lib/src/protocol_discovery.dart b/packages/flutter_tools/lib/src/protocol_discovery.dart index f1e62ed9237..bb6ce0ada2f 100644 --- a/packages/flutter_tools/lib/src/protocol_discovery.dart +++ b/packages/flutter_tools/lib/src/protocol_discovery.dart @@ -17,8 +17,7 @@ class ProtocolDiscovery { this.portForwarder, this.hostPort, this.ipv6, - }) : assert(logReader != null), - _prefix = '$serviceName listening on ' { + }) : assert(logReader != null) { _deviceLogSubscription = logReader.logLines.listen(_handleLine); } @@ -30,7 +29,8 @@ class ProtocolDiscovery { }) { const String kObservatoryService = 'Observatory'; return new ProtocolDiscovery._( - logReader, kObservatoryService, + logReader, + kObservatoryService, portForwarder: portForwarder, hostPort: hostPort, ipv6: ipv6, @@ -43,7 +43,6 @@ class ProtocolDiscovery { final int hostPort; final bool ipv6; - final String _prefix; final Completer _completer = new Completer(); StreamSubscription _deviceLogSubscription; @@ -60,10 +59,13 @@ class ProtocolDiscovery { void _handleLine(String line) { Uri uri; - final int index = line.indexOf(_prefix + 'http://'); - if (index >= 0) { + + final RegExp r = new RegExp('${RegExp.escape(serviceName)} listening on (http://[^ \n]+)'); + final Match match = r.firstMatch(line); + + if (match != null) { try { - uri = Uri.parse(line.substring(index + _prefix.length)); + uri = Uri.parse(match[1]); } catch (error) { _stopScrapingLogs(); _completer.completeError(error); @@ -75,6 +77,7 @@ class ProtocolDiscovery { _stopScrapingLogs(); _completer.complete(_forwardPort(uri)); } + } Future _forwardPort(Uri deviceUri) async { diff --git a/packages/flutter_tools/test/protocol_discovery_test.dart b/packages/flutter_tools/test/protocol_discovery_test.dart index b02210060d9..2849f0b7d9f 100644 --- a/packages/flutter_tools/test/protocol_discovery_test.dart +++ b/packages/flutter_tools/test/protocol_discovery_test.dart @@ -66,6 +66,14 @@ void main() { expect('$uri', 'http://127.0.0.1:3333'); }); + testUsingContext('discovers uri even if logs has ESC Ascii', () async { + initialize(); + logReader.addLine('Observatory listening on http://127.0.0.1:3333 \x1b['); + final Uri uri = await discoverer.uri; + expect(uri.port, 3333); + expect('$uri', 'http://127.0.0.1:3333'); + }); + testUsingContext('uri throws if logs produce bad line', () async { initialize(); Timer.run(() {