diff --git a/src/main/java/com/commafeed/backend/ContentEncodingInterceptor.java b/src/main/java/com/commafeed/backend/ContentEncodingInterceptor.java new file mode 100644 index 00000000..f576cb4a --- /dev/null +++ b/src/main/java/com/commafeed/backend/ContentEncodingInterceptor.java @@ -0,0 +1,60 @@ +package com.commafeed.backend; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; + +import org.apache.http.Header; +import org.apache.http.HeaderElement; +import org.apache.http.HttpEntity; +import org.apache.http.HttpException; +import org.apache.http.HttpResponse; +import org.apache.http.HttpResponseInterceptor; +import org.apache.http.entity.HttpEntityWrapper; +import org.apache.http.protocol.HttpContext; + +class ContentEncodingInterceptor implements HttpResponseInterceptor { + + private static final Set ALLOWED_CONTENT_ENCODINGS = new HashSet<>(Arrays.asList("gzip", "x-gzip", "deflate", "identity")); + + @Override + public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { + if (hasContent(response)) { + Header contentEncodingHeader = response.getEntity().getContentEncoding(); + if (contentEncodingHeader != null && doesNotContainAllowedEncodings(contentEncodingHeader)) { + overrideContentEncoding(response); + } + } + } + + private boolean doesNotContainAllowedEncodings(Header contentEncodingHeader) { + HeaderElement[] codecs = contentEncodingHeader.getElements(); + + for (final HeaderElement codec : codecs) { + String codecName = codec.getName().toLowerCase(Locale.US); + if (!ALLOWED_CONTENT_ENCODINGS.contains(codecName)) { + return true; + } + } + + return false; + } + + private void overrideContentEncoding(HttpResponse response) { + HttpEntity wrapped = new HttpEntityWrapper(response.getEntity()) { + @Override + public Header getContentEncoding() { + return null; + }; + }; + + response.setEntity(wrapped); + } + + private boolean hasContent(HttpResponse response) { + return response.getEntity() != null && response.getEntity().getContentLength() != 0; + } + +} diff --git a/src/main/java/com/commafeed/backend/HttpGetter.java b/src/main/java/com/commafeed/backend/HttpGetter.java index 44fa832c..bca16f9f 100644 --- a/src/main/java/com/commafeed/backend/HttpGetter.java +++ b/src/main/java/com/commafeed/backend/HttpGetter.java @@ -4,9 +4,6 @@ import java.io.IOException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; import javax.inject.Inject; import javax.inject.Singleton; @@ -23,12 +20,9 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.Consts; import org.apache.http.Header; -import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; -import org.apache.http.HttpException; import org.apache.http.HttpHeaders; import org.apache.http.HttpHost; -import org.apache.http.HttpResponse; import org.apache.http.HttpResponseInterceptor; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; @@ -41,11 +35,9 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.config.ConnectionConfig; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.entity.HttpEntityWrapper; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; -import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; import com.commafeed.CommaFeedConfiguration; @@ -61,32 +53,8 @@ public class HttpGetter { private static final String ACCEPT_LANGUAGE = "en"; private static final String PRAGMA_NO_CACHE = "No-cache"; private static final String CACHE_CONTROL_NO_CACHE = "no-cache"; - - private static final List ALLOWED_CONTENT_ENCODINGS = Arrays.asList("gzip", "x-gzip", "deflate", "identity"); - private static final HttpResponseInterceptor REMOVE_INCORRECT_CONTENT_ENCODING = new HttpResponseInterceptor() { - - @Override - public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { - HttpEntity entity = response.getEntity(); - if (entity != null && entity.getContentLength() != 0) { - Header header = entity.getContentEncoding(); - if (header != null) { - HeaderElement[] codecs = header.getElements(); - for (final HeaderElement codec : codecs) { - String codecName = codec.getName().toLowerCase(Locale.US); - if (!ALLOWED_CONTENT_ENCODINGS.contains(codecName)) { - response.setEntity(new HttpEntityWrapper(entity) { - @Override - public Header getContentEncoding() { - return null; - }; - }); - } - } - } - } - } - }; + + private static final HttpResponseInterceptor REMOVE_INCORRECT_CONTENT_ENCODING = new ContentEncodingInterceptor(); private static SSLContext SSL_CONTEXT = null; static {