diff --git a/lldb/source/Utility/UriParser.cpp b/lldb/source/Utility/UriParser.cpp --- a/lldb/source/Utility/UriParser.cpp +++ b/lldb/source/Utility/UriParser.cpp @@ -42,7 +42,7 @@ // Extract hostname if (!host_port.empty() && host_port[0] == '[') { // hostname is enclosed with square brackets. - pos = host_port.find(']'); + pos = host_port.rfind(']'); if (pos == std::string::npos) return false; diff --git a/lldb/unittests/Utility/UriParserTest.cpp b/lldb/unittests/Utility/UriParserTest.cpp --- a/lldb/unittests/Utility/UriParserTest.cpp +++ b/lldb/unittests/Utility/UriParserTest.cpp @@ -74,12 +74,19 @@ VALIDATE } -TEST(UriParserTest, TypicalPortPath) { +TEST(UriParserTest, TypicalPortPathIPv4) { const UriTestCase testCase("connect://192.168.100.132:5432/", "connect", "192.168.100.132", 5432, "/"); VALIDATE; } +TEST(UriParserTest, TypicalPortPathIPv6) { + const UriTestCase testCase( + "connect://[2601:600:107f:db64:a42b:4faa:284:3082]:5432/", "connect", + "2601:600:107f:db64:a42b:4faa:284:3082", 5432, "/"); + VALIDATE; +} + TEST(UriParserTest, BracketedHostnamePort) { const UriTestCase testCase("connect://[192.168.100.132]:5432/", "connect", "192.168.100.132", 5432, "/"); @@ -102,6 +109,21 @@ VALIDATE } +TEST(UriParserTest, BracketedHostnameWithPortIPv4) { + // Android device over IPv4: port is a part of the hostname. + const UriTestCase testCase("connect://[192.168.100.132:1234]", "connect", + "192.168.100.132:1234", -1, "/"); + VALIDATE +} + +TEST(UriParserTest, BracketedHostnameWithPortIPv6) { + // Android device over IPv6: port is a part of the hostname. + const UriTestCase testCase( + "connect://[[2601:600:107f:db64:a42b:4faa:284]:1234]", "connect", + "[2601:600:107f:db64:a42b:4faa:284]:1234", -1, "/"); + VALIDATE +} + TEST(UriParserTest, BracketedHostnameWithColon) { const UriTestCase testCase("connect://[192.168.100.132:5555]:1234", "connect", "192.168.100.132:5555", 1234, "/");