diff options
| author | rsudev <rasch@munin-soft.de> | 2012-03-07 00:48:56 +0100 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2012-03-07 00:48:56 +0100 |
| commit | f2060c49b332e5378e8fdc84d3e9bf4cdc51f714 (patch) | |
| tree | caf4d4566e485a2cab66e0074b462afd2389e7d7 /main/src/cgeo | |
| parent | a7954bc83bc3634b56cc7a283ec6cc14dfad96ef (diff) | |
| download | cgeo-f2060c49b332e5378e8fdc84d3e9bf4cdc51f714.zip cgeo-f2060c49b332e5378e8fdc84d3e9bf4cdc51f714.tar.gz cgeo-f2060c49b332e5378e8fdc84d3e9bf4cdc51f714.tar.bz2 | |
Implements requesting and processing compressed responses
Diffstat (limited to 'main/src/cgeo')
| -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 0e2f642..a58fcda 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(); |
