diff options
| author | Bananeweizen <Bananeweizen@gmx.de> | 2012-03-08 21:06:05 -0800 |
|---|---|---|
| committer | Bananeweizen <Bananeweizen@gmx.de> | 2012-03-08 21:06:05 -0800 |
| commit | bbb41eba106b610efc5a2797cc5d150246fcb374 (patch) | |
| tree | 006428d34ca423af3a458d452fec2e8023dfec99 | |
| parent | f90ac58b9e76648905a16197e6a781fc82b304bf (diff) | |
| parent | f2060c49b332e5378e8fdc84d3e9bf4cdc51f714 (diff) | |
| download | cgeo-bbb41eba106b610efc5a2797cc5d150246fcb374.zip cgeo-bbb41eba106b610efc5a2797cc5d150246fcb374.tar.gz cgeo-bbb41eba106b610efc5a2797cc5d150246fcb374.tar.bz2 | |
Merge pull request #1243 from rsudev/compressed_download
Implements requesting and processing compressed responses
| -rw-r--r-- | main/src/cgeo/geocaching/cgBase.java | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java index 3c24cdb..1c5adf8 100644 --- a/main/src/cgeo/geocaching/cgBase.java +++ b/main/src/cgeo/geocaching/cgBase.java @@ -31,7 +31,14 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +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.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.HttpClient; @@ -40,6 +47,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.cookie.Cookie; +import org.apache.http.entity.HttpEntityWrapper; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.cookie.BasicClientCookie; @@ -48,6 +56,7 @@ import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; +import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; @@ -79,6 +88,7 @@ import android.widget.LinearLayout; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; @@ -98,6 +108,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; +import java.util.zip.GZIPInputStream; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSession; @@ -1774,7 +1785,6 @@ public class cgBase { public static Bitmap requestMapTile(final String url, final String referer) { final HttpGet request = new HttpGet(url); request.addHeader("Accept", "image/png,image/*;q=0.8,*/*;q=0.5"); - //request.addHeader("Accept-Encoding", "gzip, deflate"); request.addHeader("Referer", referer); request.addHeader("X-Requested-With", "XMLHttpRequest"); final HttpResponse response = request(request); @@ -1790,7 +1800,6 @@ public class cgBase { public static String requestMapInfo(final String url, final String referer) { final HttpGet request = new HttpGet(url); request.addHeader("Accept", "application/json, text/javascript, */*; q=0.01"); - // NO request.addHeader("Accept-Encoding", "gzip deflate"); request.addHeader("Referer", referer); request.addHeader("X-Requested-With", "XMLHttpRequest"); return getResponseData(request(request), false); @@ -2312,9 +2321,64 @@ public class cgBase { final DefaultHttpClient client = new DefaultHttpClient(); client.setCookieStore(cookieStore); client.setParams(clientParams); + + client.addRequestInterceptor(new HttpRequestInterceptor() { + + @Override + 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(); + if (null != entity) { + 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")) { + Log.d(Settings.tag, "Decompressing response"); + response.setEntity( + new GzipDecompressingEntity(response.getEntity())); + return; + } + } + } + } + } + + }); + return client; } + 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 static void restoreCookieStore(final String oldCookies) { if (!cookieStoreRestored) { clearCookies(); |
