You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2017/05/01 13:04:26 UTC

svn commit: r1793324 - in /httpcomponents/httpclient/trunk: httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/ httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ httpclient5/src/main/java/org/apache/hc/client5/http/proto...

Author: olegk
Date: Mon May  1 13:04:26 2017
New Revision: 1793324

URL: http://svn.apache.org/viewvc?rev=1793324&view=rev
Log:
Fixed automatic content compression in classic exec chain

Added:
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java   (contents, props changed)
      - copied, changed from r1793320, httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseContentEncoding.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java   (contents, props changed)
      - copied, changed from r1793320, httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestResponseContentEncoding.java
Removed:
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAcceptEncoding.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseContentEncoding.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestRequestAcceptEncoding.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestResponseContentEncoding.java
Modified:
    httpcomponents/httpclient/trunk/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/HttpClientBuilder.java

Modified: httpcomponents/httpclient/trunk/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java?rev=1793324&r1=1793323&r2=1793324&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java Mon May  1 13:04:26 2017
@@ -57,7 +57,6 @@ import org.apache.hc.core5.http.io.entit
 import org.apache.hc.core5.http.message.MessageSupport;
 import org.apache.hc.core5.http.protocol.HttpContext;
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -65,7 +64,6 @@ import org.junit.Test;
  * require no intervention from the user of HttpClient, but we still want to let clients do their
  * own thing if they so wish.
  */
-@Ignore(value = "Disabled until content coding is fixed")
 public class TestContentCodings extends LocalServerTestBase {
 
     /**

Copied: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java (from r1793320, httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseContentEncoding.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java?p2=httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java&p1=httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseContentEncoding.java&r1=1793320&r2=1793324&rev=1793324&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseContentEncoding.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java Mon May  1 13:04:26 2017
@@ -24,40 +24,49 @@
  * <http://www.apache.org/>.
  *
  */
-package org.apache.hc.client5.http.protocol;
+
+package org.apache.hc.client5.http.impl.sync;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
 import java.util.zip.GZIPInputStream;
 
 import org.apache.hc.client5.http.config.RequestConfig;
+import org.apache.hc.client5.http.entity.DecompressingEntity;
 import org.apache.hc.client5.http.entity.DeflateInputStream;
 import org.apache.hc.client5.http.entity.InputStreamFactory;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.sync.ExecChain;
+import org.apache.hc.client5.http.sync.ExecChainHandler;
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
-import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.HeaderElement;
+import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.HttpException;
-import org.apache.hc.core5.http.HttpResponse;
-import org.apache.hc.core5.http.HttpResponseInterceptor;
+import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.config.Lookup;
 import org.apache.hc.core5.http.config.RegistryBuilder;
 import org.apache.hc.core5.http.message.BasicHeaderValueParser;
 import org.apache.hc.core5.http.message.ParserCursor;
-import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.util.Args;
 
 /**
- * {@link HttpResponseInterceptor} responsible for processing Content-Encoding
- * responses.
+ * Request executor in the request execution chain that is responsible
+ * for automatic response content decompression.
  * <p>
- * Instances of this class are stateless and immutable, therefore threadsafe.
- *
- * @since 4.1
+ * Further responsibilities such as communication with the opposite
+ * endpoint is delegated to the next executor in the request execution
+ * chain.
  *
+ * @since 5.0
  */
 @Contract(threading = ThreadingBehavior.IMMUTABLE)
-public class ResponseContentEncoding implements HttpResponseInterceptor {
+public final class ContentCompressionExec implements ExecChainHandler {
 
     private final static InputStreamFactory GZIP = new InputStreamFactory() {
 
@@ -76,34 +85,26 @@ public class ResponseContentEncoding imp
 
     };
 
+    private final List<String> acceptEncoding;
     private final Lookup<InputStreamFactory> decoderRegistry;
     private final boolean ignoreUnknown;
 
-    /**
-     * @since 4.5
-     */
-    public ResponseContentEncoding(final Lookup<InputStreamFactory> decoderRegistry, final boolean ignoreUnknown) {
+    public ContentCompressionExec(
+            final List<String> acceptEncoding,
+            final Lookup<InputStreamFactory> decoderRegistry,
+            final boolean ignoreUnknown) {
+        this.acceptEncoding = acceptEncoding != null ? acceptEncoding : Arrays.asList("gzip", "x-gzip", "deflate");
         this.decoderRegistry = decoderRegistry != null ? decoderRegistry :
-            RegistryBuilder.<InputStreamFactory>create()
-                    .register("gzip", GZIP)
-                    .register("x-gzip", GZIP)
-                    .register("deflate", DEFLATE)
-                    .build();
+                RegistryBuilder.<InputStreamFactory>create()
+                        .register("gzip", GZIP)
+                        .register("x-gzip", GZIP)
+                        .register("deflate", DEFLATE)
+                        .build();
         this.ignoreUnknown = ignoreUnknown;
     }
 
-    /**
-     * @since 4.5
-     */
-    public ResponseContentEncoding(final boolean ignoreUnknown) {
-        this(null, ignoreUnknown);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public ResponseContentEncoding(final Lookup<InputStreamFactory> decoderRegistry) {
-        this(decoderRegistry, true);
+    public ContentCompressionExec(final boolean ignoreUnknown) {
+        this(null, null, ignoreUnknown);
     }
 
     /**
@@ -114,18 +115,30 @@ public class ResponseContentEncoding imp
      * <li>deflate - see {@link DeflateInputStream}</li>
      * </ul>
      */
-    public ResponseContentEncoding() {
-        this(null);
+    public ContentCompressionExec() {
+        this(null, null, true);
     }
 
+
     @Override
-    public void process(
-            final HttpResponse response,
-            final EntityDetails entity,
-            final HttpContext context) throws HttpException, IOException {
+    public ClassicHttpResponse execute(
+            final ClassicHttpRequest request,
+            final ExecChain.Scope scope,
+            final ExecChain chain) throws IOException, HttpException {
+        Args.notNull(request, "HTTP request");
+        Args.notNull(scope, "Scope");
 
-        final HttpClientContext clientContext = HttpClientContext.adapt(context);
+        final HttpClientContext clientContext = scope.clientContext;
         final RequestConfig requestConfig = clientContext.getRequestConfig();
+
+        /* Signal support for Accept-Encoding transfer encodings. */
+        if (!request.containsHeader(HttpHeaders.ACCEPT_ENCODING) && requestConfig.isContentCompressionEnabled()) {
+            request.addHeader(HttpHeaders.ACCEPT_ENCODING, acceptEncoding);
+        }
+
+        final ClassicHttpResponse response = chain.proceed(request, scope);
+
+        final HttpEntity entity = response.getEntity();
         // entity can be null in case of 304 Not Modified, 204 No Content or similar
         // check for zero length entity.
         if (requestConfig.isContentCompressionEnabled() && entity != null && entity.getContentLength() != 0) {
@@ -137,10 +150,10 @@ public class ResponseContentEncoding imp
                     final String codecname = codec.getName().toLowerCase(Locale.ROOT);
                     final InputStreamFactory decoderFactory = decoderRegistry.lookup(codecname);
                     if (decoderFactory != null) {
-//                        response.setEntity(new DecompressingEntity(response.getEntity(), decoderFactory));
-//                        response.removeHeaders("Content-Length");
-//                        response.removeHeaders("Content-Encoding");
-//                        response.removeHeaders("Content-MD5");
+                        response.setEntity(new DecompressingEntity(response.getEntity(), decoderFactory));
+                        response.removeHeaders(HttpHeaders.CONTENT_LENGTH);
+                        response.removeHeaders(HttpHeaders.CONTENT_ENCODING);
+                        response.removeHeaders(HttpHeaders.CONTENT_MD5);
                     } else {
                         if (!"identity".equals(codecname) && !ignoreUnknown) {
                             throw new HttpException("Unsupported Content-Encoding: " + codec.getName());
@@ -149,6 +162,7 @@ public class ResponseContentEncoding imp
                 }
             }
         }
+        return response;
     }
 
 }

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ContentCompressionExec.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/HttpClientBuilder.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/HttpClientBuilder.java?rev=1793324&r1=1793323&r2=1793324&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/HttpClientBuilder.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/HttpClientBuilder.java Mon May  1 13:04:26 2017
@@ -32,7 +32,7 @@ import java.io.IOException;
 import java.net.ProxySelector;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -71,13 +71,11 @@ import org.apache.hc.client5.http.impl.r
 import org.apache.hc.client5.http.io.HttpClientConnectionManager;
 import org.apache.hc.client5.http.protocol.AuthenticationStrategy;
 import org.apache.hc.client5.http.protocol.RedirectStrategy;
-import org.apache.hc.client5.http.protocol.RequestAcceptEncoding;
 import org.apache.hc.client5.http.protocol.RequestAddCookies;
 import org.apache.hc.client5.http.protocol.RequestAuthCache;
 import org.apache.hc.client5.http.protocol.RequestClientConnControl;
 import org.apache.hc.client5.http.protocol.RequestDefaultHeaders;
 import org.apache.hc.client5.http.protocol.RequestExpectContinue;
-import org.apache.hc.client5.http.protocol.ResponseContentEncoding;
 import org.apache.hc.client5.http.protocol.ResponseProcessCookies;
 import org.apache.hc.client5.http.protocol.UserTokenHandler;
 import org.apache.hc.client5.http.routing.HttpRoutePlanner;
@@ -95,6 +93,7 @@ import org.apache.hc.core5.http.HttpRequ
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.HttpResponseInterceptor;
 import org.apache.hc.core5.http.config.Lookup;
+import org.apache.hc.core5.http.config.Registry;
 import org.apache.hc.core5.http.config.RegistryBuilder;
 import org.apache.hc.core5.http.impl.DefaultConnectionReuseStrategy;
 import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
@@ -205,7 +204,7 @@ public class HttpClientBuilder {
     private ServiceUnavailableRetryStrategy serviceUnavailStrategy;
     private Lookup<AuthSchemeProvider> authSchemeRegistry;
     private Lookup<CookieSpecProvider> cookieSpecRegistry;
-    private Map<String, InputStreamFactory> contentDecoderMap;
+    private LinkedHashMap<String, InputStreamFactory> contentDecoderMap;
     private CookieStore cookieStore;
     private CredentialsProvider credentialsProvider;
     private String userAgent;
@@ -602,7 +601,7 @@ public class HttpClientBuilder {
      * to be used for automatic content decompression.
      */
     public final HttpClientBuilder setContentDecoderRegistry(
-            final Map<String, InputStreamFactory> contentDecoderMap) {
+            final LinkedHashMap<String, InputStreamFactory> contentDecoderMap) {
         this.contentDecoderMap = contentDecoderMap;
         return this;
     }
@@ -794,32 +793,12 @@ public class HttpClientBuilder {
         if (!cookieManagementDisabled) {
             b.add(new RequestAddCookies());
         }
-        if (!contentCompressionDisabled) {
-            if (contentDecoderMap != null) {
-                final List<String> encodings = new ArrayList<>(contentDecoderMap.keySet());
-                Collections.sort(encodings);
-                b.add(new RequestAcceptEncoding(encodings));
-            } else {
-                b.add(new RequestAcceptEncoding());
-            }
-        }
         if (!authCachingDisabled) {
             b.add(new RequestAuthCache());
         }
         if (!cookieManagementDisabled) {
             b.add(new ResponseProcessCookies());
         }
-        if (!contentCompressionDisabled) {
-            if (contentDecoderMap != null) {
-                final RegistryBuilder<InputStreamFactory> b2 = RegistryBuilder.create();
-                for (final Map.Entry<String, InputStreamFactory> entry: contentDecoderMap.entrySet()) {
-                    b2.register(entry.getKey(), entry.getValue());
-                }
-                b.add(new ResponseContentEncoding(b2.build()));
-            } else {
-                b.add(new ResponseContentEncoding());
-            }
-        }
         if (requestInterceptors != null) {
             for (final RequestInterceptorEntry entry: requestInterceptors) {
                 if (entry.postion == RequestInterceptorEntry.Postion.LAST) {
@@ -884,6 +863,24 @@ public class HttpClientBuilder {
                     ChainElements.REDIRECT.name());
         }
 
+        if (!contentCompressionDisabled) {
+            if (contentDecoderMap != null) {
+                final List<String> encodings = new ArrayList<>(contentDecoderMap.keySet());
+                final RegistryBuilder<InputStreamFactory> b2 = RegistryBuilder.create();
+                for (final Map.Entry<String, InputStreamFactory> entry: contentDecoderMap.entrySet()) {
+                    b2.register(entry.getKey(), entry.getValue());
+                }
+                final Registry<InputStreamFactory> decoderRegistry = b2.build();
+                execChainDefinition.addFirst(
+                        new ContentCompressionExec(encodings, decoderRegistry, true),
+                        ChainElements.REDIRECT.name());
+            } else {
+                execChainDefinition.addFirst(
+                        new ContentCompressionExec(true),
+                        ChainElements.REDIRECT.name());
+            }
+        }
+
         // Optionally, add connection back-off executor
         if (this.backoffManager != null && this.connectionBackoffStrategy != null) {
             execChainDefinition.addFirst(new BackoffStrategyExec(this.connectionBackoffStrategy, this.backoffManager),

Copied: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java (from r1793320, httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestResponseContentEncoding.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java?p2=httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java&p1=httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestResponseContentEncoding.java&r1=1793320&r2=1793324&rev=1793324&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestResponseContentEncoding.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java Mon May  1 13:04:26 2017
@@ -24,46 +24,80 @@
  * <http://www.apache.org/>.
  *
  */
-package org.apache.hc.client5.http.protocol;
+package org.apache.hc.client5.http.impl.sync;
 
+import org.apache.hc.client5.http.HttpRoute;
+import org.apache.hc.client5.http.StandardMethods;
 import org.apache.hc.client5.http.config.RequestConfig;
 import org.apache.hc.client5.http.entity.DecompressingEntity;
 import org.apache.hc.client5.http.entity.GzipDecompressingEntity;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.sync.ExecChain;
+import org.apache.hc.client5.http.sync.ExecRuntime;
+import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.HttpException;
-import org.apache.hc.core5.http.HttpResponseInterceptor;
+import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.StringEntity;
+import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
 import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
-import org.apache.hc.core5.http.protocol.BasicHttpContext;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.junit.Assert;
-import org.junit.Ignore;
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TestContentCompressionExec {
+
+    @Mock
+    private ExecRuntime execRuntime;
+    @Mock
+    private ExecChain execChain;
+    @Mock
+    private ClassicHttpRequest originaRequest;
+
+    private HttpClientContext context;
+    private HttpHost host;
+    private ExecChain.Scope scope;
+    private ContentCompressionExec impl;
+
+    @Before
+    public void setup() {
+        host = new HttpHost("somehost", 80);
+        context = HttpClientContext.create();
+        scope = new ExecChain.Scope(new HttpRoute(host), originaRequest, execRuntime, context);
+        impl = new ContentCompressionExec();
+    }
 
-@Ignore
-public class TestResponseContentEncoding {
 
     @Test
     public void testContentEncodingNoEntity() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNull(entity);
     }
 
     @Test
     public void testNoContentEncoding() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("plain stuff");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertTrue(entity instanceof StringEntity);
@@ -71,14 +105,16 @@ public class TestResponseContentEncoding
 
     @Test
     public void testGzipContentEncoding() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("encoded stuff");
         original.setContentEncoding("GZip");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertTrue(entity instanceof DecompressingEntity);
@@ -86,14 +122,16 @@ public class TestResponseContentEncoding
 
     @Test
     public void testGzipContentEncodingZeroLength() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("");
         original.setContentEncoding("GZip");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertTrue(entity instanceof StringEntity);
@@ -101,14 +139,16 @@ public class TestResponseContentEncoding
 
     @Test
     public void testXGzipContentEncoding() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("encoded stuff");
         original.setContentEncoding("x-gzip");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertTrue(entity instanceof DecompressingEntity);
@@ -116,14 +156,16 @@ public class TestResponseContentEncoding
 
     @Test
     public void testDeflateContentEncoding() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("encoded stuff");
         original.setContentEncoding("deFlaTe");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertTrue(entity instanceof DecompressingEntity);
@@ -131,14 +173,16 @@ public class TestResponseContentEncoding
 
     @Test
     public void testIdentityContentEncoding() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("encoded stuff");
         original.setContentEncoding("identity");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertTrue(entity instanceof StringEntity);
@@ -146,18 +190,22 @@ public class TestResponseContentEncoding
 
     @Test(expected=HttpException.class)
     public void testUnknownContentEncoding() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("encoded stuff");
         original.setContentEncoding("whatever");
         response.setEntity(original);
-        final HttpContext context = new BasicHttpContext();
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding(false);
-        interceptor.process(response, response.getEntity(), context);
+        impl = new ContentCompressionExec(false);
+
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
     }
 
     @Test
     public void testContentEncodingRequestParameter() throws Exception {
+        final ClassicHttpRequest request = new BasicClassicHttpRequest(StandardMethods.GET.name(), host, "/");
         final ClassicHttpResponse response = new BasicClassicHttpResponse(200, "OK");
         final StringEntity original = new StringEntity("encoded stuff");
         original.setContentEncoding("GZip");
@@ -167,11 +215,12 @@ public class TestResponseContentEncoding
                 .setContentCompressionEnabled(false)
                 .build();
 
-        final HttpContext context = new BasicHttpContext();
         context.setAttribute(HttpClientContext.REQUEST_CONFIG, config);
 
-        final HttpResponseInterceptor interceptor = new ResponseContentEncoding();
-        interceptor.process(response, response.getEntity(), context);
+        Mockito.when(execChain.proceed(request, scope)).thenReturn(response);
+
+        impl.execute(request, scope, execChain);
+
         final HttpEntity entity = response.getEntity();
         Assert.assertNotNull(entity);
         Assert.assertFalse(entity instanceof GzipDecompressingEntity);

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestContentCompressionExec.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain