package com.zachklipp.captivate.captive_portal; import com.zachklipp.captivate.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.regex.Pattern; public class HttpResponseContentsDetector extends PortalDetector { private static final String URL = "http://www.apple.com/library/test/success.html"; private static final Pattern NO_PORTAL_PATTERN = Pattern.compile( "<TITLE>Success</TITLE></HEAD><BODY>Success</BODY>"); public static PortalDetector createDetector() { Log.d("Creating HttpResponseContentsDetector"); return new HttpResponseContentsDetector(URL, NO_PORTAL_PATTERN); } private String mUrl; private Pattern mNoPortalPattern; public HttpResponseContentsDetector(String url, Pattern noPortalPattern) { assert(url != null && url.length() > 0); assert(noPortalPattern != null); mUrl = url; mNoPortalPattern = noPortalPattern; } @Override protected void onCheckForPortal() { HttpClient client = new DefaultHttpClient(); HttpUriRequest request = new HttpGet(mUrl); HttpResponse response = executeRequestOrThrow(client, request); Log.d("Response (%d bytes): %s", response.getEntity().getContentLength(), response.getStatusLine()); if (doesResponseIndicatePortal(response.getEntity())) { reportPortal(new PortalInfo(mUrl)); } else { reportNoPortal(); } } private HttpResponse executeRequestOrThrow(HttpClient client, HttpUriRequest request) { try { return client.execute(request); } catch (IOException ex) { throw new RuntimeException("Error executing request", ex); } } private boolean doesResponseIndicatePortal(HttpEntity response) { try { return doesResponseContentIndicatePortal(response.getContent()); } catch (IOException e) { throw new RuntimeException("Error reading response", e); } } private boolean doesResponseContentIndicatePortal(InputStream response) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(response)); String inputLine; boolean onPortal = true; while ((inputLine = reader.readLine()) != null && onPortal) { if (doesResponseLineIndicateNoPortal(inputLine)) onPortal = false; } return onPortal; } private boolean doesResponseLineIndicateNoPortal(String response) { // Don't use matches(), cause that requires the ENTIRE string to match return mNoPortalPattern.matcher(response).find(); } }