package com.duckduckgo.mobile.android.network; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.List; import java.util.zip.GZIPInputStream; import android.content.Context; import ch.boye.httpclientandroidlib.Header; import ch.boye.httpclientandroidlib.HeaderElement; import ch.boye.httpclientandroidlib.HttpEntity; import ch.boye.httpclientandroidlib.HttpException; import ch.boye.httpclientandroidlib.HttpRequest; import ch.boye.httpclientandroidlib.HttpRequestInterceptor; import ch.boye.httpclientandroidlib.HttpResponse; import ch.boye.httpclientandroidlib.HttpResponseInterceptor; import ch.boye.httpclientandroidlib.HttpStatus; import ch.boye.httpclientandroidlib.NameValuePair; import ch.boye.httpclientandroidlib.client.entity.UrlEncodedFormEntity; import ch.boye.httpclientandroidlib.client.methods.HttpGet; import ch.boye.httpclientandroidlib.client.methods.HttpPost; import ch.boye.httpclientandroidlib.conn.ClientConnectionManager; import ch.boye.httpclientandroidlib.entity.HttpEntityWrapper; import ch.boye.httpclientandroidlib.impl.client.DefaultConnectionKeepAliveStrategy; import ch.boye.httpclientandroidlib.impl.client.DefaultHttpClient; import ch.boye.httpclientandroidlib.params.BasicHttpParams; import ch.boye.httpclientandroidlib.params.HttpParams; import ch.boye.httpclientandroidlib.params.HttpProtocolParams; import ch.boye.httpclientandroidlib.protocol.HTTP; import ch.boye.httpclientandroidlib.protocol.HttpContext; import ch.boye.httpclientandroidlib.util.EntityUtils; import info.guardianproject.netcipher.client.StrongHttpsClient; import com.duckduckgo.mobile.android.activity.DuckDuckGo; import com.duckduckgo.mobile.android.util.DDGConstants; public class DDGHttpClient extends StrongHttpsClient { HttpGet request; HttpEntity entity; public HttpResponse response; HttpPost post; ClientConnectionManager connManager; private String m_strResult; // Set the timeout in milliseconds until a connection is established. int timeoutConnection = 3000; // Set the default socket timeout (SO_TIMEOUT) in milliseconds which is the timeout for waiting for data. int timeoutSocket = 3000; private int mStatusCode; /** * XXX currently UNUSED */ public DDGHttpClient(Context context){ super(context); HttpParams httpParameters = new BasicHttpParams(); //HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); //HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); // HttpClientParams.setRedirecting(httpParameters, false); setParams(httpParameters); setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()); // HttpClientParams.setCookiePolicy(httpParameters, CookiePolicy.BEST_MATCH); HttpProtocolParams.setUserAgent(httpParameters, DDGConstants.USER_AGENT); // HttpProtocolParams.setUserAgent(httpParameters, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); // HttpProtocolParams.setUserAgent(httpParameters, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0"); // HttpProtocolParams.setUserAgent(httpParameters, "Prototip/0.1 (Linux; U; Android 1.1)"); } public DDGHttpClient(Context context, ClientConnectionManager cm, HttpParams httpParams){ super(context); setParams(httpParams); connManager = cm; // HttpParams httpParameters = new BasicHttpParams(); //HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); //HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); // HttpClientParams.setRedirecting(httpParams, false); // setParams(httpParams); setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()); // HttpClientParams.setCookiePolicy(httpParameters, CookiePolicy.BEST_MATCH); // HttpProtocolParams.setUserAgent(httpParams, "HTC_Dream Mozilla/5.0 (Linux; U; Android 1.5; en-us; Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1"); // HttpProtocolParams.setUserAgent(httpParameters, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); // HttpProtocolParams.setUserAgent(httpParameters, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0"); // HttpProtocolParams.setUserAgent(httpParameters, "Prototip/0.1 (Linux; U; Android 1.1)"); HttpProtocolParams.setUserAgent(httpParams, DDGConstants.USER_AGENT); this.addRequestInterceptor(new HttpRequestInterceptor() { public void process( final HttpRequest request, final HttpContext context) throws HttpException, IOException { if (!request.containsHeader("Accept-Encoding")) { request.addHeader("Accept-Encoding", "gzip"); } } }); this.addResponseInterceptor(new HttpResponseInterceptor() { public void process( final HttpResponse response, final HttpContext context) throws HttpException, IOException { HttpEntity entity = response.getEntity(); Header ceheader = entity.getContentEncoding(); if (ceheader != null) { HeaderElement[] codecs = ceheader.getElements(); for (int i = 0; i < codecs.length; i++) { if (codecs[i].getName().equalsIgnoreCase("gzip")) { response.setEntity( new GzipDecompressingEntity(response.getEntity())); return; } } } } }); } static class GzipDecompressingEntity extends HttpEntityWrapper { public GzipDecompressingEntity(final HttpEntity entity) { super(entity); } @Override public InputStream getContent() throws IOException, IllegalStateException { // the wrapped entity's getContent() decides about repeatability InputStream wrappedin = wrappedEntity.getContent(); return new GZIPInputStream(wrappedin); } @Override public long getContentLength() { // length of ungzipped content is not known return -1; } } public HttpEntity doPost(String url, List<NameValuePair> params) throws DDGHttpException { try { post = new HttpPost(url); post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); response = execute(post); mStatusCode = response.getStatusLine().getStatusCode(); if(mStatusCode != HttpStatus.SC_OK){ throw new DDGHttpException(mStatusCode); } return response.getEntity(); } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(Exception ex){ // unsupportencoding, clientprotocol, io throw new DDGHttpException(ex.getMessage()); } } public String doPostString(String url, List<NameValuePair> params) throws DDGHttpException { try { HttpEntity entity = doPost(url,params); m_strResult = EntityUtils.toString(entity); // EntityUtils.consume(entity); return m_strResult; } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(IOException ex){ // io throw new DDGHttpException(ex.getMessage()); } } public HttpEntity doGet(String url) throws DDGHttpException { try { request = new HttpGet(url); // Log.v("REQ",url); response = execute(request); mStatusCode = response.getStatusLine().getStatusCode(); if(mStatusCode != HttpStatus.SC_OK){ throw new DDGHttpException(mStatusCode); } entity = response.getEntity(); return entity; } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(Exception ex){ // clientprotocol, io throw new DDGHttpException(ex.getMessage()); } } public String doGetString(String url) throws DDGHttpException { try { entity = doGet(url); m_strResult = EntityUtils.toString(entity); // EntityUtils.consume(entity); return m_strResult; } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(IOException ex){ // io throw new DDGHttpException(ex.getMessage()); } } public HttpEntity doGet(String url, List<NameValuePair> params, boolean raw) throws DDGHttpException { try { String paramString = ""; int paramSize = params.size(); NameValuePair p; if(raw){ for(int i=0;i<paramSize;i++){ p = params.get(i); paramString += p.getName() + "=" + URLEncoder.encode(p.getValue(),"utf-8"); if(i!=paramSize-1) paramString += "&"; } } else { // default for(int i=0;i<paramSize;i++){ p = params.get(i); paramString += p.getName() + "=" + p.getValue(); if(i!=paramSize-1) paramString += "&"; } } request = new HttpGet(url + "?" + paramString); // Log.v("REQ",url + "?" + paramString); response = execute(request); mStatusCode = response.getStatusLine().getStatusCode(); if(mStatusCode != HttpStatus.SC_OK){ throw new DDGHttpException(mStatusCode); } return response.getEntity(); } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(Exception ex){ // clientprotocol, io throw new DDGHttpException(ex.getMessage()); } } public String doGetString(String url, List<NameValuePair> params) throws DDGHttpException { try { entity = doGet(url, params, false); m_strResult = EntityUtils.toString(entity); // EntityUtils.consume(entity); return m_strResult; } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(IOException ex){ // io throw new DDGHttpException(ex.getMessage()); } } public String rawGet(String url, List<NameValuePair> params) throws DDGHttpException { try { entity = doGet(url, params, true); m_strResult = EntityUtils.toString(entity); // EntityUtils.consume(entity); return m_strResult; } catch(DDGHttpException ddgEx){ throw ddgEx; } catch(IOException ex){ // io throw new DDGHttpException(ex.getMessage()); } } }