diff options
author | Paul Jensen <pauljensen@google.com> | 2014-08-04 09:12:24 -0400 |
---|---|---|
committer | Paul Jensen <pauljensen@google.com> | 2014-08-06 15:17:54 -0400 |
commit | e547ff281020b08eb51ef7b2786831f7aacdd73c (patch) | |
tree | 25a04728d506d912c4f4a235569df9308b3f95aa /services/core/java/com/android/server/connectivity/NetworkMonitor.java | |
parent | d2a9363208efc721b2ebb8f98a55b4ee08af4a76 (diff) | |
download | frameworks_base-e547ff281020b08eb51ef7b2786831f7aacdd73c.zip frameworks_base-e547ff281020b08eb51ef7b2786831f7aacdd73c.tar.gz frameworks_base-e547ff281020b08eb51ef7b2786831f7aacdd73c.tar.bz2 |
Use OkHTTP instead of my home-made HTTP, for network validation.
The home-made version was only done because there was no previous way to
perform network-specific HTTP. The home-made version has already shown
incompatibility, see linked bug.
bug:16316314
Change-Id: Ic9e50174552d1466eb1ff59ff9d28e18035cc3e0
Diffstat (limited to 'services/core/java/com/android/server/connectivity/NetworkMonitor.java')
-rw-r--r-- | services/core/java/com/android/server/connectivity/NetworkMonitor.java | 118 |
1 files changed, 31 insertions, 87 deletions
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 488c09d..3039ede 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -38,14 +38,8 @@ import com.android.internal.util.StateMachine; import com.android.server.ConnectivityService; import com.android.server.connectivity.NetworkAgentInfo; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.io.IOException; -import java.io.OutputStreamWriter; import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Socket; import java.net.URL; /** @@ -608,84 +602,41 @@ public class NetworkMonitor extends StateMachine { private int isCaptivePortal() { if (!mIsCaptivePortalCheckEnabled) return 204; - String urlString = "http://" + mServer + "/generate_204"; - if (DBG) { - log("Checking " + urlString + " on " + mNetworkAgentInfo.networkInfo.getExtraInfo()); - } HttpURLConnection urlConnection = null; - Socket socket = null; int httpResponseCode = 599; try { - URL url = new URL(urlString); - // TODO: check that standard HttpURLConnection doesn't choke on - // cruel and unusual captive portals, and then replace the - // hand-rolled HTTP code in the else branch with this code. - if (false) { - url = mNetworkAgentInfo.network.getBoundURL(url); - urlConnection = (HttpURLConnection) url.openConnection(); - urlConnection.setInstanceFollowRedirects(false); - urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS); - urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS); - urlConnection.setUseCaches(false); - urlConnection.getInputStream(); - httpResponseCode = urlConnection.getResponseCode(); - } else { - // Lookup addresses only on this Network. - InetAddress[] hostAddresses = mNetworkAgentInfo.network.getAllByName(url.getHost()); - // Try all addresses. - for (int i = 0; i < hostAddresses.length; i++) { - // Create a new socket for every IP address. See http://b/16664129 . - socket = mNetworkAgentInfo.network.getSocketFactory().createSocket(); - socket.setSoTimeout(SOCKET_TIMEOUT_MS); - if (DBG) log("Connecting to " + hostAddresses[i]); - try { - socket.connect(new InetSocketAddress(hostAddresses[i], - url.getDefaultPort()), SOCKET_TIMEOUT_MS); - break; - } catch (IOException e) { - // Ignore exceptions on all but the last. - if (i == (hostAddresses.length - 1)) throw e; - } - } - if (DBG) log("Requesting " + url.getFile()); - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream()); - writer.write("GET " + url.getFile() + " HTTP/1.1\r\nHost: " + url.getHost() + - "\r\nUser-Agent: " + System.getProperty("http.agent") + - "\r\nConnection: close\r\n\r\n"); - writer.flush(); - String response = reader.readLine(); - if (DBG) log("Received \"" + response + "\""); - if (response != null && (response.startsWith("HTTP/1.1 ") || - // NOTE: We may want to consider an "HTTP/1.0 204" response to be a captive - // portal. The only example of this seen so far was a captive portal. For - // the time being go with prior behavior of assuming it's not a captive - // portal. If it is considered a captive portal, a different sign-in URL - // is needed (i.e. can't browse a 204). This could be the result of an HTTP - // proxy server. - response.startsWith("HTTP/1.0 "))) { - // NOTE: We may want to consider an "200" response with "Content-length=0" to - // not be a captive portal. This could be the result of an HTTP proxy server. - // See b/9972012. - httpResponseCode = Integer.parseInt(response.substring(9, 12)); - } else { - // A response was received but not understood. The fact that a - // response was sent indicates there's some kind of responsive network - // out there so put up the notification to the user to log into the network - // so the user can have the final say as to whether the network is useful. - httpResponseCode = 399; - while (DBG && response != null && !response.isEmpty()) { - try { - response = reader.readLine(); - } catch (IOException e) { - break; - } - log("Received \"" + response + "\""); - } - } + URL url = new URL("http", mServer, "/generate_204"); + if (DBG) { + log("Checking " + url.toString() + " on " + + mNetworkAgentInfo.networkInfo.getExtraInfo()); + } + url = mNetworkAgentInfo.network.getBoundURL(url); + urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setInstanceFollowRedirects(false); + urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS); + urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS); + urlConnection.setUseCaches(false); + urlConnection.getInputStream(); + httpResponseCode = urlConnection.getResponseCode(); + if (DBG) { + log("isCaptivePortal: ret=" + httpResponseCode + + " headers=" + urlConnection.getHeaderFields()); + } + // NOTE: We may want to consider an "HTTP/1.0 204" response to be a captive + // portal. The only example of this seen so far was a captive portal. For + // the time being go with prior behavior of assuming it's not a captive + // portal. If it is considered a captive portal, a different sign-in URL + // is needed (i.e. can't browse a 204). This could be the result of an HTTP + // proxy server. + + // Consider 200 response with "Content-length=0" to not be a captive portal. + // There's no point in considering this a captive portal as the user cannot + // sign-in to an empty page. Probably the result of a broken transparent proxy. + // See http://b/9972012. + if (httpResponseCode == 200 && urlConnection.getContentLength() == 0) { + if (DBG) log("Empty 200 response interpreted as 204 response."); + httpResponseCode = 204; } - if (DBG) log("isCaptivePortal: ret=" + httpResponseCode); } catch (IOException e) { if (DBG) log("Probably not a portal: exception " + e); if (httpResponseCode == 599) { @@ -695,13 +646,6 @@ public class NetworkMonitor extends StateMachine { if (urlConnection != null) { urlConnection.disconnect(); } - if (socket != null) { - try { - socket.close(); - } catch (IOException e) { - // Ignore - } - } } return httpResponseCode; } |