Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 143a2cf4 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Fix captive portal detection on IPv6 networks.

Currently the captive portal check URL is generated by
concatenating scheme, "://", IP address, and port. This breaks
for IPv6 because IPv6 addresses in URLs must be enclosed in
square brackets (e.g., http://2001:db8::1/generate_204 is
invalid; should he http://[2001:db8::1]/generate_204 instead).
The resulting MalformedURLException causes isMobileOk to report
that there is no captive portal, even if there is one.

Fortunately the three-arg URL constructor already knows how to
construct URLs with IPv6 addresses. Use that instead of
generating the URL ourselves.

Bug: 10801896
Change-Id: I02605ef62f493a34f25bb405ef02b111543a76fd
parent be5ba9a2
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -4247,6 +4247,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                                addrTried ++) {

                            // Choose the address at random but make sure its type is supported
                            // TODO: This doesn't work 100% of the time, because we may end up
                            // trying the same invalid address more than once and ignoring one
                            // of the valid addresses.
                            InetAddress hostAddr = addresses[rand.nextInt(addresses.length)];
                            if (((hostAddr instanceof Inet4Address) && linkHasIpv4)
                                    || ((hostAddr instanceof Inet6Address) && linkHasIpv6)) {
@@ -4271,10 +4274,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                            }

                            // Rewrite the url to have numeric address to use the specific route.
                            // I also set the "Connection" to "Close" as by default "Keep-Alive"
                            // is used which is useless in this case.
                            URL newUrl = new URL(orgUri.getScheme() + "://"
                                    + hostAddr.getHostAddress() + orgUri.getPath());
                            URL newUrl = new URL(orgUri.getScheme(),
                                    hostAddr.getHostAddress(), orgUri.getPath());
                            log("isMobileOk: newUrl=" + newUrl);

                            HttpURLConnection urlConn = null;
@@ -4287,6 +4288,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                                urlConn.setReadTimeout(SOCKET_TIMEOUT_MS);
                                urlConn.setUseCaches(false);
                                urlConn.setAllowUserInteraction(false);
                                // Set the "Connection" to "Close" as by default "Keep-Alive"
                                // is used which is useless in this case.
                                urlConn.setRequestProperty("Connection", "close");
                                int responseCode = urlConn.getResponseCode();