aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBananeweizen <Bananeweizen@gmx.de>2012-03-08 21:06:05 -0800
committerBananeweizen <Bananeweizen@gmx.de>2012-03-08 21:06:05 -0800
commitbbb41eba106b610efc5a2797cc5d150246fcb374 (patch)
tree006428d34ca423af3a458d452fec2e8023dfec99
parentf90ac58b9e76648905a16197e6a781fc82b304bf (diff)
parentf2060c49b332e5378e8fdc84d3e9bf4cdc51f714 (diff)
downloadcgeo-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.java68
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();