diff --git a/api/src/com/todoroo/andlib/service/HttpRestClient.java b/api/src/com/todoroo/andlib/service/HttpRestClient.java index 8d86df3a0..806ac1318 100644 --- a/api/src/com/todoroo/andlib/service/HttpRestClient.java +++ b/api/src/com/todoroo/andlib/service/HttpRestClient.java @@ -5,10 +5,16 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.ref.WeakReference; +import java.util.zip.GZIPInputStream; import org.apache.http.Header; +import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; +import org.apache.http.HttpException; +import org.apache.http.HttpRequest; +import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponse; +import org.apache.http.HttpResponseInterceptor; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; @@ -19,12 +25,14 @@ import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.entity.HttpEntityWrapper; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.HttpContext; import android.util.Log; @@ -49,15 +57,36 @@ public class HttpRestClient implements RestClient { private WeakReference httpClient = null; protected boolean debug = false; + private int timeout = TIMEOUT_MILLIS; + @SuppressWarnings("nls") public HttpRestClient() { DependencyInjectionService.getInstance().inject(this); + + System.err.println("NEW REST CLIENT"); + + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); + + params = new BasicHttpParams(); + HttpConnectionParams.setConnectionTimeout(params, timeout); + HttpConnectionParams.setSoTimeout(params, timeout); + params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); + params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); + params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + + cm = new ThreadSafeClientConnManager(params, schemeRegistry); } public HttpRestClient(int timeout) { super(); this.timeout = timeout; + + HttpConnectionParams.setConnectionTimeout(params, timeout); + HttpConnectionParams.setSoTimeout(params, timeout); } private static String convertStreamToString(InputStream is) { @@ -88,28 +117,74 @@ public class HttpRestClient implements RestClient { return sb.toString(); } + private HttpParams params; + private ThreadSafeClientConnManager cm; + @SuppressWarnings("nls") private synchronized HttpClient getClient() { if (httpClient == null || httpClient.get() == null) { - SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); - - HttpParams params = new BasicHttpParams(); - HttpConnectionParams.setConnectionTimeout(params, timeout); - HttpConnectionParams.setSoTimeout(params, timeout); - params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); - params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); - params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); - HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); - - ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); - HttpClient client = new DefaultHttpClient(cm, params); + DefaultHttpClient client = new DefaultHttpClient(cm, params); httpClient = new WeakReference(client); + actsAsGzippable(client); return client; - } else { - return httpClient.get(); } + return httpClient.get(); + } + + @SuppressWarnings("nls") + protected void actsAsGzippable(DefaultHttpClient client) { + client.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"); + } + + }); + + client.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; + } + } + } + } + }); + } + + private 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; + } + } private String processHttpResponse(HttpResponse response) throws IOException {