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 2021/11/09 21:50:22 UTC

[httpcomponents-client] 02/02: Updated examples and unit tests to make use of lambda expressions for response message processing

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git

commit 6cce8286b43cdf4b321adbdeb69ec6f9bac5dc2b
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Tue Nov 9 14:32:58 2021 +0100

    Updated examples and unit tests to make use of lambda expressions for response message processing
---
 .../testing/sync/TestBasicConnectionManager.java   |   6 +-
 .../testing/sync/TestClientAuthentication.java     | 118 ++++++----
 .../sync/TestClientAuthenticationFakeNTLM.java     |  45 ++--
 .../testing/sync/TestClientRequestExecution.java   |  77 +++----
 .../client5/testing/sync/TestConnectionReuse.java  |  41 ++--
 .../client5/testing/sync/TestContentCodings.java   |  59 +++--
 .../testing/sync/TestCookieVirtualHost.java        |  37 ++-
 .../testing/sync/TestIdleConnectionEviction.java   |  12 +-
 .../testing/sync/TestMalformedServerResponse.java  |  19 +-
 .../sync/TestMinimalClientRequestExecution.java    |  11 +-
 .../hc/client5/testing/sync/TestRedirects.java     | 254 ++++++++++-----------
 .../hc/client5/testing/sync/TestSPNegoScheme.java  |  17 +-
 .../testing/sync/TestStatefulConnManagement.java   |  30 +--
 .../testing/sync/TestWindowsNegotiateScheme.java   |   6 +-
 .../client5/http/examples/ClientAbortMethod.java   |  22 +-
 .../http/examples/ClientAuthentication.java        |  11 +-
 .../http/examples/ClientChunkEncodedPost.java      |  11 +-
 .../client5/http/examples/ClientConfiguration.java |  41 ++--
 .../http/examples/ClientConnectionConfig.java      |   7 +-
 .../http/examples/ClientConnectionRelease.java     |  74 ------
 .../client5/http/examples/ClientCustomContext.java |   9 +-
 .../examples/ClientCustomPublicSuffixList.java     |  13 +-
 .../hc/client5/http/examples/ClientCustomSSL.java  |  12 +-
 .../examples/ClientEvictExpiredConnections.java    |   9 +-
 .../client5/http/examples/ClientExecuteProxy.java  |  11 +-
 .../client5/http/examples/ClientExecuteSOCKS.java  |  24 +-
 .../hc/client5/http/examples/ClientFormLogin.java  |  26 +--
 .../client5/http/examples/ClientInterceptors.java  |  11 +-
 .../examples/ClientMultiThreadedExecution.java     |   6 +-
 .../http/examples/ClientMultipartFormPost.java     |  11 +-
 .../ClientPreemptiveBasicAuthentication.java       |  11 +-
 .../ClientPreemptiveDigestAuthentication.java      |   9 +-
 .../http/examples/ClientProxyAuthentication.java   |  11 +-
 ...rtMethod.java => ClientResponseProcessing.java} |  33 ++-
 .../http/examples/ClientWithResponseHandler.java   |  73 ------
 .../classic/TestHttpClientBuilderInterceptors.java |   8 +-
 36 files changed, 554 insertions(+), 621 deletions(-)

diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestBasicConnectionManager.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestBasicConnectionManager.java
index 65033af..e90832a 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestBasicConnectionManager.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestBasicConnectionManager.java
@@ -27,7 +27,6 @@
 package org.apache.hc.client5.testing.sync;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
@@ -42,10 +41,11 @@ public class TestBasicConnectionManager extends LocalServerTestBase {
 
         final HttpHost target = start();
         final HttpGet get = new HttpGet("/random/1024");
-        try (CloseableHttpResponse response = this.httpclient.execute(target, get)) {
+        this.httpclient.execute(target, get, response -> {
             Assert.assertEquals(200, response.getCode());
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
     }
 
     @Test
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
index 80c2834..32cf21e 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
@@ -53,7 +53,6 @@ import org.apache.hc.client5.http.impl.auth.BasicAuthCache;
 import org.apache.hc.client5.http.impl.auth.BasicScheme;
 import org.apache.hc.client5.http.impl.auth.BasicSchemeFactory;
 import org.apache.hc.client5.http.impl.auth.CredentialsProviderBuilder;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.client5.testing.BasicTestAuthenticator;
 import org.apache.hc.client5.testing.auth.Authenticator;
@@ -108,12 +107,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+        this.httpclient.execute(target, httpget, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
         Mockito.verify(credsProvider).getCredentials(
                 Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
@@ -130,12 +130,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+        this.httpclient.execute(target, httpget, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
         Mockito.verify(credsProvider).getCredentials(
                 Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
@@ -152,12 +153,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         final HttpHost target = start();
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+        this.httpclient.execute(target, httpget, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
         Mockito.verify(credsProvider).getCredentials(
                 Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
@@ -182,11 +184,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpput, context)) {
+        this.httpclient.execute(target, httpput, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity);
-        }
+            return null;
+        });
     }
 
     @Test
@@ -208,12 +211,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .thenReturn(new UsernamePasswordCredentials("test", "boom".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        try (final CloseableHttpResponse response = this.httpclient.execute(target, httpput, context)) {
+        this.httpclient.execute(target, httpput, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(401, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
     }
 
     @Test
@@ -230,12 +234,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httppost, context)) {
+        this.httpclient.execute(target, httppost, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
         Mockito.verify(credsProvider).getCredentials(
                 Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
@@ -259,12 +264,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        try (final CloseableHttpResponse response = this.httpclient.execute(target, httppost, context)) {
+        this.httpclient.execute(target, httppost, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(401, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
     }
 
     @Test
@@ -285,12 +291,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         for (int i = 0; i < 5; i++) {
             final HttpGet httpget = new HttpGet("/");
-            try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            this.httpclient.execute(target, httpget, context, response -> {
                 final HttpEntity entity1 = response.getEntity();
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
                 Assert.assertNotNull(entity1);
                 EntityUtils.consume(entity1);
-            }
+                return null;
+            });
         }
 
         Mockito.verify(authStrategy).select(Mockito.any(), Mockito.any(), Mockito.any());
@@ -322,12 +329,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         for (final String requestPath: new String[] {"/blah/a", "/blah/b?huh", "/blah/c", "/bl%61h/%61"}) {
             final HttpGet httpget = new HttpGet(requestPath);
-            try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            this.httpclient.execute(target, httpget, context, response -> {
                 final HttpEntity entity1 = response.getEntity();
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
                 Assert.assertNotNull(entity1);
                 EntityUtils.consume(entity1);
-            }
+                return null;
+            });
         }
 
         // There should be only single auth strategy call for all successful message exchanges
@@ -343,12 +351,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         for (final String requestPath: new String[] {"/blah/a", "/yada/a", "/blah/blah/", "/buh/a"}) {
             final HttpGet httpget = new HttpGet(requestPath);
-            try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            this.httpclient.execute(target, httpget, context, response -> {
                 final HttpEntity entity1 = response.getEntity();
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
                 Assert.assertNotNull(entity1);
                 EntityUtils.consume(entity1);
-            }
+                return null;
+            });
         }
 
         // There should be an auth strategy call for all successful message exchanges
@@ -402,30 +411,33 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         final HttpGet httpget1 = new HttpGet("/this");
 
-        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget1, context)) {
-            final HttpEntity entity1 = response1.getEntity();
-            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+        this.httpclient.execute(target, httpget1, context, response -> {
+            final HttpEntity entity1 = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity1);
             EntityUtils.consume(entity1);
-        }
+            return null;
+        });
 
         final HttpGet httpget2 = new HttpGet("/this");
 
-        try (final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget2, context)) {
-            final HttpEntity entity2 = response2.getEntity();
-            Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
+        this.httpclient.execute(target, httpget2, context, response -> {
+            final HttpEntity entity2 = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity2);
             EntityUtils.consume(entity2);
-        }
+            return null;
+        });
 
         final HttpGet httpget3 = new HttpGet("/that");
 
-        try (final ClassicHttpResponse response3 = this.httpclient.execute(target, httpget3, context)) {
-            final HttpEntity entity3 = response3.getEntity();
-            Assert.assertEquals(HttpStatus.SC_OK, response3.getCode());
+        this.httpclient.execute(target, httpget3, context, response -> {
+            final HttpEntity entity3 = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity3);
             EntityUtils.consume(entity3);
-        }
+            return null;
+        });
 
         Mockito.verify(authStrategy, Mockito.times(2)).select(Mockito.any(), Mockito.any(), Mockito.any());
     }
@@ -437,7 +449,7 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("http://test:test@" +  target.toHostString() + "/");
 
         final HttpClientContext context = HttpClientContext.create();
-        Assert.assertThrows(ClientProtocolException.class, () -> this.httpclient.execute(target, httpget, context));
+        Assert.assertThrows(ClientProtocolException.class, () -> this.httpclient.execute(target, httpget, context, response -> null));
     }
 
     @Test
@@ -454,12 +466,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setAuthCache(authCache);
 
         final HttpGet httpget = new HttpGet("/");
-        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
-            final HttpEntity entity1 = response1.getEntity();
-            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            final HttpEntity entity1 = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity1);
             EntityUtils.consume(entity1);
-        }
+            return null;
+        });
 
         Mockito.verify(authenticator).authenticate(Mockito.any(), Mockito.any(), Mockito.any());
     }
@@ -479,12 +492,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .build());
 
         final HttpGet httpget = new HttpGet("/");
-        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
-            final HttpEntity entity1 = response1.getEntity();
-            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            final HttpEntity entity1 = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
             Assert.assertNotNull(entity1);
             EntityUtils.consume(entity1);
-        }
+            return null;
+        });
 
         Mockito.verify(authenticator).authenticate(Mockito.any(), Mockito.any(), Mockito.any());
     }
@@ -519,11 +533,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setCredentialsProvider(credsProvider);
 
         final HttpGet httpget = new HttpGet("/");
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+        this.httpclient.execute(target, httpget, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED, response.getCode());
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
     }
 
     @Test
@@ -550,10 +565,11 @@ public class TestClientAuthentication extends LocalServerTestBase {
         for (int i = 0; i < 2; i++) {
             final HttpGet httpget = new HttpGet("/");
 
-            try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            this.httpclient.execute(target, httpget, context, response -> {
                 EntityUtils.consume(response.getEntity());
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            }
+                return null;
+            });
         }
     }
 
@@ -623,12 +639,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
         for (int i = 0; i < 10; i++) {
             final HttpGet httpget = new HttpGet("/");
             httpget.setConfig(config);
-            try (final CloseableHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            this.httpclient.execute(target, httpget, context, response -> {
                 final HttpEntity entity = response.getEntity();
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
                 Assert.assertNotNull(entity);
                 EntityUtils.consume(entity);
-            }
+                return null;
+            });
         }
     }
 
@@ -654,12 +671,13 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+        this.httpclient.execute(target, httpget, context, response -> {
             final HttpEntity entity = response.getEntity();
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
             Assert.assertNotNull(entity);
             EntityUtils.consume(entity);
-        }
+            return null;
+        });
         Mockito.verify(credsProvider).getCredentials(
                 Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthenticationFakeNTLM.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthenticationFakeNTLM.java
index f4a3d9e..6abad83 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthenticationFakeNTLM.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthenticationFakeNTLM.java
@@ -82,10 +82,11 @@ public class TestClientAuthenticationFakeNTLM extends LocalServerTestBase {
         final HttpContext context = HttpClientContext.create();
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        EntityUtils.consume(response.getEntity());
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED,
-                response.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
     }
 
     static class NtlmType2MessageResponseHandler implements HttpRequestHandler {
@@ -129,10 +130,11 @@ public class TestClientAuthenticationFakeNTLM extends LocalServerTestBase {
         final HttpContext context = HttpClientContext.create();
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        EntityUtils.consume(response.getEntity());
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED,
-                response.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
     }
 
     @Test
@@ -153,10 +155,11 @@ public class TestClientAuthenticationFakeNTLM extends LocalServerTestBase {
         final HttpContext context = HttpClientContext.create();
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        EntityUtils.consume(response.getEntity());
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED,
-                response.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
     }
 
     static class NtlmType2MessageOnlyResponseHandler implements HttpRequestHandler {
@@ -192,10 +195,11 @@ public class TestClientAuthenticationFakeNTLM extends LocalServerTestBase {
                 .build());
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        EntityUtils.consume(response.getEntity());
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED,
-                response.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
     }
 
     @Test
@@ -212,10 +216,11 @@ public class TestClientAuthenticationFakeNTLM extends LocalServerTestBase {
                 .build());
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        EntityUtils.consume(response.getEntity());
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED,
-                response.getCode());
+        this.httpclient.execute(target, httpget, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
     }
 
 }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientRequestExecution.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientRequestExecution.java
index bfb16c3..ebe121c 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientRequestExecution.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientRequestExecution.java
@@ -158,16 +158,17 @@ public class TestClientRequestExecution extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, httpget, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            final HttpRequest reqWrapper = context.getRequest();
 
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
 
-        final Header[] myheaders = reqWrapper.getHeaders("my-header");
-        Assert.assertNotNull(myheaders);
-        Assert.assertEquals(1, myheaders.length);
+            final Header[] myheaders = reqWrapper.getHeaders("my-header");
+            Assert.assertNotNull(myheaders);
+            Assert.assertEquals(1, myheaders.length);
+            return null;
+        });
     }
 
     @Test
@@ -218,7 +219,7 @@ public class TestClientRequestExecution extends LocalServerTestBase {
                         new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
                         -1, null));
         Assert.assertThrows(IOException.class, () ->
-                this.httpclient.execute(target, httppost, context));
+                this.httpclient.execute(target, httppost, context, response -> null));
     }
 
     @Test
@@ -229,10 +230,11 @@ public class TestClientRequestExecution extends LocalServerTestBase {
 
         final HttpClientContext context = HttpClientContext.create();
         final ClassicHttpRequest request = new BasicClassicHttpRequest("GET", "{{|boom|}}");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request, context);
-        EntityUtils.consume(response.getEntity());
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+        this.httpclient.execute(target, request, context, response -> {
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         final HttpRequest reqWrapper = context.getRequest();
 
@@ -248,9 +250,11 @@ public class TestClientRequestExecution extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/stuff#blahblah");
         final HttpClientContext context = HttpClientContext.create();
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, httpget, context, response -> {
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         final HttpRequest request = context.getRequest();
         Assert.assertEquals("/stuff", request.getRequestUri());
@@ -273,9 +277,10 @@ public class TestClientRequestExecution extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet(uri);
         final HttpClientContext context = HttpClientContext.create();
 
-        final ClassicHttpResponse response = this.httpclient.execute(httpget, context);
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(httpget, context, response -> {
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            return null;
+        });
 
         final HttpRequest request = context.getRequest();
         Assert.assertEquals("/stuff", request.getRequestUri());
@@ -298,16 +303,14 @@ public class TestClientRequestExecution extends LocalServerTestBase {
             for (int i = 0; i < 20; i++) {
                 final HttpGet httpget = new HttpGet("/random/1000");
 
-                executorService.schedule(new Runnable() {
+                executorService.schedule(httpget::cancel, 1, TimeUnit.MILLISECONDS);
 
-                    @Override
-                    public void run() {
-                        httpget.cancel();
-                    }
-                }, 1, TimeUnit.MILLISECONDS);
+                try {
+                    this.httpclient.execute(target, httpget, response -> {
+                        EntityUtils.consume(response.getEntity());
+                        return null;
+                    });
 
-                try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget)) {
-                    EntityUtils.consume(response.getEntity());
                 } catch (final Exception ignore) {
                 }
             }
@@ -316,26 +319,20 @@ public class TestClientRequestExecution extends LocalServerTestBase {
             for (int i = 0; i < 20; i++) {
                 final HttpGet httpget = new HttpGet("/random/1000");
 
-                executorService.schedule(new Runnable() {
-
-                    @Override
-                    public void run() {
-                        httpget.cancel();
-                    }
-                }, rnd.nextInt(200), TimeUnit.MILLISECONDS);
+                executorService.schedule(httpget::cancel, rnd.nextInt(200), TimeUnit.MILLISECONDS);
 
-                try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget)) {
+                this.httpclient.execute(target, httpget, response -> {
                     EntityUtils.consume(response.getEntity());
-                } catch (final Exception ignore) {
-                }
-
+                    return null;
+                });
             }
 
             for (int i = 0; i < 5; i++) {
                 final HttpGet httpget = new HttpGet("/random/1000");
-                try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget)) {
+                this.httpclient.execute(target, httpget, response -> {
                     EntityUtils.consume(response.getEntity());
-                }
+                    return null;
+                });
             }
 
         } finally {
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionReuse.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionReuse.java
index c88a506..1f9a1a0 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionReuse.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionReuse.java
@@ -32,7 +32,6 @@ import java.net.URI;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HeaderElements;
@@ -168,28 +167,36 @@ public class TestConnectionReuse extends LocalServerTestBase {
                 .build();
         final HttpHost target = start(httpproc, null);
 
-        ClassicHttpResponse response = this.httpclient.execute(target, new HttpGet("/random/2000"));
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, new HttpGet("/random/2000"), response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         Assert.assertEquals(1, this.connManager.getTotalStats().getAvailable());
 
-        response = this.httpclient.execute(target, new HttpGet("/random/2000"));
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, new HttpGet("/random/2000"), response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         Assert.assertEquals(1, this.connManager.getTotalStats().getAvailable());
 
         // Now sleep for 1.1 seconds and let the timeout do its work
         Thread.sleep(1100);
-        response = this.httpclient.execute(target, new HttpGet("/random/2000"));
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, new HttpGet("/random/2000"), response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         Assert.assertEquals(1, this.connManager.getTotalStats().getAvailable());
 
         // Do another request just under the 1 second limit & make
         // sure we reuse that connection.
         Thread.sleep(500);
-        response = this.httpclient.execute(target, new HttpGet("/random/2000"));
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, new HttpGet("/random/2000"), response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         Assert.assertEquals(1, this.connManager.getTotalStats().getAvailable());
     }
@@ -223,14 +230,14 @@ public class TestConnectionReuse extends LocalServerTestBase {
             try {
                 for (int i = 0; i < this.repetitions; i++) {
                     final HttpGet httpget = new HttpGet(this.requestURI);
-                    final ClassicHttpResponse response = this.httpclient.execute(
-                            this.target,
-                            httpget);
-                    if (this.forceClose) {
-                        httpget.cancel();
-                    } else {
-                        EntityUtils.consume(response.getEntity());
-                    }
+                    this.httpclient.execute(this.target, httpget, response -> {
+                        if (this.forceClose) {
+                            response.close();
+                        } else {
+                            EntityUtils.consume(response.getEntity());
+                        }
+                        return null;
+                    });
                 }
             } catch (final Exception ex) {
                 this.exception = ex;
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java
index a074259..9b32edb 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestContentCodings.java
@@ -92,9 +92,11 @@ public class TestContentCodings extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request);
-        Assert.assertEquals(HttpStatus.SC_NO_CONTENT, response.getCode());
-        Assert.assertNull(response.getEntity());
+        this.httpclient.execute(target, request, response -> {
+            Assert.assertEquals(HttpStatus.SC_NO_CONTENT, response.getCode());
+            Assert.assertNull(response.getEntity());
+            return null;
+        });
     }
 
     /**
@@ -112,9 +114,11 @@ public class TestContentCodings extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request);
-        Assert.assertEquals("The entity text is correctly transported", entityText,
-                EntityUtils.toString(response.getEntity()));
+        this.httpclient.execute(target, request, response -> {
+            Assert.assertEquals("The entity text is correctly transported", entityText,
+                    EntityUtils.toString(response.getEntity()));
+            return null;
+        });
     }
 
     /**
@@ -132,9 +136,11 @@ public class TestContentCodings extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request);
-        Assert.assertEquals("The entity text is correctly transported", entityText,
-                EntityUtils.toString(response.getEntity()));
+        this.httpclient.execute(target, request, response -> {
+            Assert.assertEquals("The entity text is correctly transported", entityText,
+                    EntityUtils.toString(response.getEntity()));
+            return null;
+        });
     }
 
     /**
@@ -151,9 +157,11 @@ public class TestContentCodings extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request);
-        Assert.assertEquals("The entity text is correctly transported", entityText,
-                EntityUtils.toString(response.getEntity()));
+        this.httpclient.execute(target, request, response -> {
+            Assert.assertEquals("The entity text is correctly transported", entityText,
+                    EntityUtils.toString(response.getEntity()));
+            return null;
+        });
     }
 
     /**
@@ -217,12 +225,13 @@ public class TestContentCodings extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request);
-        final ByteArrayOutputStream out = new ByteArrayOutputStream();
-
-        response.getEntity().writeTo(out);
+        this.httpclient.execute(target, request, response -> {
+            final ByteArrayOutputStream out = new ByteArrayOutputStream();
+            response.getEntity().writeTo(out);
+            Assert.assertEquals(entityText, out.toString("utf-8"));
+            return null;
+        });
 
-        Assert.assertEquals(entityText, out.toString("utf-8"));
     }
 
     @Test
@@ -234,12 +243,12 @@ public class TestContentCodings extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final ClassicHttpResponse response = this.httpclient.execute(target, request);
-        final ByteArrayOutputStream out = new ByteArrayOutputStream();
-
-        response.getEntity().writeTo(out);
-
-        Assert.assertEquals(entityText, out.toString("utf-8"));
+        this.httpclient.execute(target, request, response -> {
+            final ByteArrayOutputStream out = new ByteArrayOutputStream();
+            response.getEntity().writeTo(out);
+            Assert.assertEquals(entityText, out.toString("utf-8"));
+            return out;
+        });
     }
 
     @Test
@@ -428,8 +437,8 @@ public class TestContentCodings extends LocalServerTestBase {
             try {
                 startGate.await();
                 try {
-                    final ClassicHttpResponse response = client.execute(target, request);
-                    text = EntityUtils.toString(response.getEntity());
+                    text = httpclient.execute(target, request, response ->
+                            EntityUtils.toString(response.getEntity()));
                 } catch (final Exception e) {
                     failed = true;
                 } finally {
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestCookieVirtualHost.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestCookieVirtualHost.java
index ff78c56..3302e12 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestCookieVirtualHost.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestCookieVirtualHost.java
@@ -33,7 +33,6 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.cookie.BasicCookieStore;
 import org.apache.hc.client5.http.cookie.Cookie;
 import org.apache.hc.client5.http.cookie.CookieStore;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpStatus;
@@ -96,12 +95,12 @@ public class TestCookieVirtualHost extends LocalServerTestBase {
         context.setCookieStore(cookieStore);
 
         // First request : retrieve a domain cookie from remote server.
-        URI uri = new URI("http://app.mydomain.fr");
-        HttpGet httpRequest = new HttpGet(uri);
-        httpRequest.addHeader("X-Request", "1");
-        try (CloseableHttpResponse response1 = this.httpclient.execute(target, httpRequest, context)) {
-            EntityUtils.consume(response1.getEntity());
-        }
+        final HttpGet request1 = new HttpGet(new URI("http://app.mydomain.fr"));
+        request1.addHeader("X-Request", "1");
+        this.httpclient.execute(target, request1, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         // We should have one cookie set on domain.
         final List<Cookie> cookies = cookieStore.getCookies();
@@ -110,20 +109,20 @@ public class TestCookieVirtualHost extends LocalServerTestBase {
         Assert.assertEquals("name1", cookies.get(0).getName());
 
         // Second request : send the cookie back.
-        uri = new URI("http://app.mydomain.fr");
-        httpRequest = new HttpGet(uri);
-        httpRequest.addHeader("X-Request", "2");
-        try (CloseableHttpResponse response2 = this.httpclient.execute(target, httpRequest, context)) {
-            EntityUtils.consume(response2.getEntity());
-        }
+        final HttpGet request2 = new HttpGet(new URI("http://app.mydomain.fr"));
+        request2.addHeader("X-Request", "2");
+        this.httpclient.execute(target, request2, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         // Third request : Host header
-        uri = new URI("http://app.mydomain.fr");
-        httpRequest = new HttpGet(uri);
-        httpRequest.addHeader("X-Request", "3");
-        try (CloseableHttpResponse response3 = this.httpclient.execute(target, httpRequest, context)) {
-            EntityUtils.consume(response3.getEntity());
-        }
+        final HttpGet request3 = new HttpGet(new URI("http://app.mydomain.fr"));
+        request3.addHeader("X-Request", "3");
+        this.httpclient.execute(target, request3, context, response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
     }
 
 }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestIdleConnectionEviction.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestIdleConnectionEviction.java
index 46cecd1..a364ef5 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestIdleConnectionEviction.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestIdleConnectionEviction.java
@@ -33,7 +33,6 @@ import org.apache.hc.client5.http.ClientProtocolException;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.IdleConnectionEvictor;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.util.TimeValue;
@@ -95,14 +94,19 @@ public class TestIdleConnectionEviction extends LocalServerTestBase {
             try {
                 for (int i = 0; i < this.count; i++) {
                     final HttpGet httpget = new HttpGet(this.requestUri);
-                    try (final ClassicHttpResponse response = this.httpclient.execute(this.target, httpget)) {
+                    this.httpclient.execute(this.target, httpget, response -> {
                         final int status = response.getCode();
                         if (status != 200) {
                             throw new ClientProtocolException("Unexpected status code: " + status);
                         }
                         EntityUtils.consume(response.getEntity());
-                        Thread.sleep(10);
-                    }
+                        try {
+                            Thread.sleep(10);
+                        } catch (final InterruptedException ex) {
+                            Thread.currentThread().interrupt();
+                        }
+                        return null;
+                    });
                 }
             } catch (final Exception ex) {
                 this.ex = ex;
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMalformedServerResponse.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMalformedServerResponse.java
index fb929d5..456a8b2 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMalformedServerResponse.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMalformedServerResponse.java
@@ -31,7 +31,6 @@ import java.net.Socket;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.HttpException;
@@ -98,15 +97,17 @@ public class TestMalformedServerResponse {
             final HttpHost target = new HttpHost("localhost", server.getLocalPort());
             try (final CloseableHttpClient httpclient = HttpClientBuilder.create().build()) {
                 final HttpGet get1 = new HttpGet("/nostuff");
-                try (final CloseableHttpResponse response1 = httpclient.execute(target, get1)) {
-                    Assert.assertEquals(HttpStatus.SC_NO_CONTENT, response1.getCode());
-                    EntityUtils.consume(response1.getEntity());
-                }
+                httpclient.execute(target, get1, response -> {
+                    Assert.assertEquals(HttpStatus.SC_NO_CONTENT, response.getCode());
+                    EntityUtils.consume(response.getEntity());
+                    return null;
+                });
                 final HttpGet get2 = new HttpGet("/stuff");
-                try (final CloseableHttpResponse response2 = httpclient.execute(target, get2)) {
-                    Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
-                    EntityUtils.consume(response2.getEntity());
-                }
+                httpclient.execute(target, get2, response -> {
+                    Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+                    EntityUtils.consume(response.getEntity());
+                    return null;
+                });
             }
         }
     }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMinimalClientRequestExecution.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMinimalClientRequestExecution.java
index a42ae48..946cb11 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMinimalClientRequestExecution.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestMinimalClientRequestExecution.java
@@ -32,7 +32,6 @@ import java.util.Locale;
 import java.util.Set;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.core5.http.ClassicHttpRequest;
@@ -80,10 +79,11 @@ public class TestMinimalClientRequestExecution extends LocalServerTestBase {
         final HttpClientContext context = HttpClientContext.create();
         for (int i = 0; i < 10; i++) {
             final HttpGet request = new HttpGet("/");
-            try (final CloseableHttpResponse response = this.httpclient.execute(target, request, context)) {
+            this.httpclient.execute(target, request, context, response -> {
                 EntityUtils.consume(response.getEntity());
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            }
+                return null;
+            });
 
             final HttpRequest reqWrapper = context.getRequest();
             Assert.assertNotNull(reqWrapper);
@@ -108,10 +108,11 @@ public class TestMinimalClientRequestExecution extends LocalServerTestBase {
 
         for (int i = 0; i < 10; i++) {
             final HttpGet request = new HttpGet("/");
-            try (final CloseableHttpResponse response = this.httpclient.execute(target, request)) {
+            this.httpclient.execute(target, request, response -> {
                 EntityUtils.consume(response.getEntity());
                 Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            }
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestRedirects.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestRedirects.java
index 7712a7f..4163d38 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestRedirects.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestRedirects.java
@@ -48,7 +48,6 @@ import org.apache.hc.client5.testing.classic.RedirectingDecorator;
 import org.apache.hc.client5.testing.redirect.Redirect;
 import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
@@ -80,19 +79,18 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpClientContext context = HttpClientContext.create();
         final HttpGet httpget = new HttpGet("/oldlocation/100");
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_MULTIPLE_CHOICES, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/100").build(),
-                    reqWrapper.getUri());
-
-            final RedirectLocations redirects = context.getRedirectLocations();
-            Assert.assertNotNull(redirects);
-            Assert.assertEquals(0, redirects.size());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/100").build(),
+                reqWrapper.getUri());
+
+        final RedirectLocations redirects = context.getRedirectLocations();
+        Assert.assertNotNull(redirects);
+        Assert.assertEquals(0, redirects.size());
     }
 
     @Test
@@ -104,19 +102,19 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpClientContext context = HttpClientContext.create();
         final HttpGet httpget = new HttpGet("/oldlocation/100");
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_MULTIPLE_CHOICES, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/100").build(),
-                    reqWrapper.getUri());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
-            final RedirectLocations redirects = context.getRedirectLocations();
-            Assert.assertNotNull(redirects);
-            Assert.assertEquals(0, redirects.size());
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/100").build(),
+                reqWrapper.getUri());
 
-            EntityUtils.consume(response.getEntity());
-        }
+        final RedirectLocations redirects = context.getRedirectLocations();
+        Assert.assertNotNull(redirects);
+        Assert.assertEquals(0, redirects.size());
     }
 
     @Test
@@ -129,22 +127,22 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/100");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
-                    reqWrapper.getUri());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
-            final RedirectLocations redirects = context.getRedirectLocations();
-            Assert.assertNotNull(redirects);
-            Assert.assertEquals(1, redirects.size());
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
+                reqWrapper.getUri());
 
-            final URI redirect = new URIBuilder().setHttpHost(target).setPath("/random/100").build();
-            Assert.assertTrue(redirects.contains(redirect));
+        final RedirectLocations redirects = context.getRedirectLocations();
+        Assert.assertNotNull(redirects);
+        Assert.assertEquals(1, redirects.size());
 
-            EntityUtils.consume(response.getEntity());
-        }
+        final URI redirect = new URIBuilder().setHttpHost(target).setPath("/random/100").build();
+        Assert.assertTrue(redirects.contains(redirect));
     }
 
     @Test
@@ -157,15 +155,16 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/50");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/50").build(),
-                    reqWrapper.getUri());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
+
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/50").build(),
+                reqWrapper.getUri());
+
     }
 
     @Test
@@ -184,14 +183,15 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/100");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+        this.httpclient.execute(target, httpget, context, response -> {
             final HttpRequest reqWrapper = context.getRequest();
 
             Assert.assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, response.getCode());
             Assert.assertEquals("/oldlocation/100", reqWrapper.getRequestUri());
 
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
     }
 
     @Test
@@ -204,15 +204,15 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/123");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/123").build(),
-                    reqWrapper.getUri());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
+
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/123").build(),
+                reqWrapper.getUri());
     }
 
     @Test
@@ -228,19 +228,19 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/stuff");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_NOT_MODIFIED, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/stuff").build(),
-                    reqWrapper.getUri());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
-            final RedirectLocations redirects = context.getRedirectLocations();
-            Assert.assertNotNull(redirects);
-            Assert.assertEquals(0, redirects.size());
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/stuff").build(),
+                reqWrapper.getUri());
 
-            EntityUtils.consume(response.getEntity());
-        }
+        final RedirectLocations redirects = context.getRedirectLocations();
+        Assert.assertNotNull(redirects);
+        Assert.assertEquals(0, redirects.size());
     }
 
     @Test
@@ -256,19 +256,19 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/stuff");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_USE_PROXY, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/stuff").build(),
-                    reqWrapper.getUri());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
-            final RedirectLocations redirects = context.getRedirectLocations();
-            Assert.assertNotNull(redirects);
-            Assert.assertEquals(0, redirects.size());
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/oldlocation/stuff").build(),
+                reqWrapper.getUri());
 
-            EntityUtils.consume(response.getEntity());
-        }
+        final RedirectLocations redirects = context.getRedirectLocations();
+        Assert.assertNotNull(redirects);
+        Assert.assertEquals(0, redirects.size());
     }
 
     @Test
@@ -281,15 +281,15 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/123");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/123").build(),
-                    reqWrapper.getUri());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
+
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/123").build(),
+                reqWrapper.getUri());
     }
 
     @Test
@@ -307,7 +307,7 @@ public class TestRedirects extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/circular-oldlocation/123");
         httpget.setConfig(config);
         final ClientProtocolException exception = Assert.assertThrows(ClientProtocolException.class, () ->
-                this.httpclient.execute(target, httpget));
+                this.httpclient.execute(target, httpget, response -> null));
         Assert.assertTrue(exception.getCause() instanceof RedirectException);
     }
 
@@ -325,7 +325,7 @@ public class TestRedirects extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/circular-oldlocation/123");
         httpget.setConfig(config);
         final ClientProtocolException exception = Assert.assertThrows(ClientProtocolException.class, () ->
-                this.httpclient.execute(target, httpget));
+                this.httpclient.execute(target, httpget, response -> null));
         Assert.assertTrue(exception.getCause() instanceof CircularRedirectException);
     }
 
@@ -340,17 +340,16 @@ public class TestRedirects extends LocalServerTestBase {
         final HttpPost httppost = new HttpPost("/oldlocation/stuff");
         httppost.setEntity(new StringEntity("stuff"));
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httppost, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httppost, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/echo/stuff").build(),
-                    reqWrapper.getUri());
-            Assert.assertEquals("GET", reqWrapper.getMethod());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/echo/stuff").build(),
+                reqWrapper.getUri());
+        Assert.assertEquals("GET", reqWrapper.getMethod());
     }
 
     @Test
@@ -369,15 +368,15 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/stuff");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
-                    reqWrapper.getUri());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
+
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
+                reqWrapper.getUri());
     }
 
     @Test
@@ -397,16 +396,15 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/random/oldlocation");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
-                    reqWrapper.getUri());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
+                reqWrapper.getUri());
     }
 
     @Test
@@ -425,7 +423,7 @@ public class TestRedirects extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/oldlocation");
 
         final ClientProtocolException exception = Assert.assertThrows(ClientProtocolException.class, () ->
-                this.httpclient.execute(target, httpget));
+                this.httpclient.execute(target, httpget, response -> null));
         MatcherAssert.assertThat(exception.getCause(), CoreMatchers.instanceOf(HttpException.class));
     }
 
@@ -445,7 +443,7 @@ public class TestRedirects extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/oldlocation");
 
         final ClientProtocolException exception = Assert.assertThrows(ClientProtocolException.class, () ->
-                this.httpclient.execute(target, httpget));
+                this.httpclient.execute(target, httpget, response -> null));
         MatcherAssert.assertThat(exception.getCause(), CoreMatchers.instanceOf(ProtocolException.class));
     }
 
@@ -467,18 +465,18 @@ public class TestRedirects extends LocalServerTestBase {
         context.setCookieStore(cookieStore);
         final HttpGet httpget = new HttpGet("/oldlocation/100");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
-                    reqWrapper.getUri());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
-            final Header[] headers = reqWrapper.getHeaders("Cookie");
-            Assert.assertEquals("There can only be one (cookie)", 1, headers.length);
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
+                reqWrapper.getUri());
 
-            EntityUtils.consume(response.getEntity());
-        }
+        final Header[] headers = reqWrapper.getHeaders("Cookie");
+        Assert.assertEquals("There can only be one (cookie)", 1, headers.length);
     }
 
     @Test
@@ -493,18 +491,18 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/100");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
-                    reqWrapper.getUri());
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
 
-            final Header header = reqWrapper.getFirstHeader(HttpHeaders.USER_AGENT);
-            Assert.assertEquals("my-test-client", header.getValue());
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
+                reqWrapper.getUri());
 
-            EntityUtils.consume(response.getEntity());
-        }
+        final Header header = reqWrapper.getFirstHeader(HttpHeaders.USER_AGENT);
+        Assert.assertEquals("my-test-client", header.getValue());
     }
 
     @Test
@@ -538,15 +536,15 @@ public class TestRedirects extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/oldlocation/100");
 
-        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
-            final HttpRequest reqWrapper = context.getRequest();
-
+        this.httpclient.execute(target, httpget, context, response -> {
             Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
-                    reqWrapper.getUri());
-
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
+        final HttpRequest reqWrapper = context.getRequest();
+
+        Assert.assertEquals(new URIBuilder().setHttpHost(target).setPath("/random/100").build(),
+                reqWrapper.getUri());
 
         MatcherAssert.assertThat(values.poll(), CoreMatchers.equalTo("gzip, x-gzip, deflate"));
         MatcherAssert.assertThat(values.poll(), CoreMatchers.equalTo("gzip, x-gzip, deflate"));
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSPNegoScheme.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSPNegoScheme.java
index 1a516b1..dc1604d 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSPNegoScheme.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSPNegoScheme.java
@@ -168,10 +168,11 @@ public class TestSPNegoScheme extends LocalServerTestBase {
 
         final String s = "/path";
         final HttpGet httpget = new HttpGet(s);
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget);
-        EntityUtils.consume(response.getEntity());
-
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+        this.httpclient.execute(target, httpget, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
     }
 
     /**
@@ -199,10 +200,12 @@ public class TestSPNegoScheme extends LocalServerTestBase {
 
         final String s = "/path";
         final HttpGet httpget = new HttpGet(s);
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget);
-        EntityUtils.consume(response.getEntity());
+        this.httpclient.execute(target, httpget, response -> {
+            EntityUtils.consume(response.getEntity());
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            return null;
+        });
 
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
     }
 
 }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestStatefulConnManagement.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestStatefulConnManagement.java
index 1cf5a27..d8a8d14 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestStatefulConnManagement.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestStatefulConnManagement.java
@@ -161,16 +161,15 @@ public class TestStatefulConnManagement extends LocalServerTestBase {
                 this.context.setAttribute("user", this.uid);
                 for (int r = 0; r < this.requestCount; r++) {
                     final HttpGet httpget = new HttpGet("/");
-                    final ClassicHttpResponse response = this.httpclient.execute(
-                            this.target,
-                            httpget,
-                            this.context);
+                    this.httpclient.execute(this.target, httpget, this.context, response -> {
+                        EntityUtils.consume(response.getEntity());
+                        return null;
+                    });
                     this.count++;
 
                     final EndpointDetails endpointDetails = this.context.getEndpointDetails();
                     final String connuid = Integer.toHexString(System.identityHashCode(endpointDetails));
                     this.context.setAttribute("r" + r, connuid);
-                    EntityUtils.consume(response.getEntity());
                 }
 
             } catch (final Exception ex) {
@@ -202,9 +201,10 @@ public class TestStatefulConnManagement extends LocalServerTestBase {
         // Bottom of the pool : a *keep alive* connection to Route 1.
         final HttpContext context1 = new BasicHttpContext();
         context1.setAttribute("user", "stuff");
-        final ClassicHttpResponse response1 = this.httpclient.execute(
-                target, new HttpGet("/"), context1);
-        EntityUtils.consume(response1.getEntity());
+        this.httpclient.execute(target, new HttpGet("/"), context1, response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         // The ConnPoolByRoute now has 1 free connection, out of 2 max
         // The ConnPoolByRoute has one RouteSpcfcPool, that has one free connection
@@ -215,9 +215,10 @@ public class TestStatefulConnManagement extends LocalServerTestBase {
         // Send a very simple HTTP get (it MUST be simple, no auth, no proxy, no 302, no 401, ...)
         // Send it to another route. Must be a keepalive.
         final HttpContext context2 = new BasicHttpContext();
-        final ClassicHttpResponse response2 = this.httpclient.execute(
-                new HttpHost("127.0.0.1", this.server.getPort()), new HttpGet("/"), context2);
-        EntityUtils.consume(response2.getEntity());
+        this.httpclient.execute(new HttpHost("127.0.0.1", this.server.getPort()), new HttpGet("/"), context2, response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
         // ConnPoolByRoute now has 2 free connexions, out of its 2 max.
         // The [localhost][stuff] RouteSpcfcPool is the same as earlier
         // And there is a [127.0.0.1][null] pool with 1 free connection
@@ -230,13 +231,14 @@ public class TestStatefulConnManagement extends LocalServerTestBase {
         // The killed conn is the oldest, which means the first HTTPGet ([localhost][stuff]).
         // When this happens, the RouteSpecificPool becomes empty.
         final HttpContext context3 = new BasicHttpContext();
-        final ClassicHttpResponse response3 = this.httpclient.execute(
-                target, new HttpGet("/"), context3);
+        this.httpclient.execute(target, new HttpGet("/"), context3, response -> {
+            EntityUtils.consume(response.getEntity());
+            return null;
+        });
 
         // If the ConnPoolByRoute did not behave coherently with the RouteSpecificPool
         // this may fail. Ex : if the ConnPool discared the route pool because it was empty,
         // but still used it to build the request3 connection.
-        EntityUtils.consume(response3.getEntity());
 
     }
 
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestWindowsNegotiateScheme.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestWindowsNegotiateScheme.java
index 58241d3..28938e7 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestWindowsNegotiateScheme.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestWindowsNegotiateScheme.java
@@ -30,7 +30,6 @@ import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.StandardAuthScheme;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
 import org.apache.hc.client5.http.impl.win.WinHttpClients;
 import org.apache.hc.client5.http.impl.win.WindowsNegotiateSchemeGetTokenFail;
@@ -71,9 +70,10 @@ public class TestWindowsNegotiateScheme extends LocalServerTestBase {
 
         final HttpHost target = start();
         final HttpGet httpGet = new HttpGet("/");
-        try (final CloseableHttpResponse response = customClient.execute(target, httpGet)) {
+        customClient.execute(target, httpGet, response -> {
             EntityUtils.consume(response.getEntity());
-        }
+            return null;
+        });
     }
 
 }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java
index 55ab2fd..ca9d35b 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java
@@ -27,10 +27,15 @@
 
 package org.apache.hc.client5.http.examples;
 
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * This example demonstrates how to abort an HTTP method before its normal completion.
@@ -41,14 +46,17 @@ public class ClientAbortMethod {
         try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
             final HttpGet httpget = new HttpGet("http://httpbin.org/get");
 
+            final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
+            // Cancel the request after once second
+            executorService.schedule(httpget::cancel, 1, TimeUnit.SECONDS);
+
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
-            try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
+            httpclient.execute(httpget, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                // Do not feel like reading the response body
-                // Call cancel on the request object
-                httpget.cancel();
-            }
+                System.out.println(httpget + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAuthentication.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAuthentication.java
index f8c681c..0ed2683 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAuthentication.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAuthentication.java
@@ -29,10 +29,10 @@ package org.apache.hc.client5.http.examples;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.auth.CredentialsProviderBuilder;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * A simple example that uses HttpClient to execute an HTTP request against
@@ -49,11 +49,12 @@ public class ClientAuthentication {
             final HttpGet httpget = new HttpGet("http://httpbin.org/basic-auth/user/passwd");
 
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
-            try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
+            httpclient.execute(httpget, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-            }
+                System.out.println(httpget + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientChunkEncodedPost.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientChunkEncodedPost.java
index 9117d33..b51c50e 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientChunkEncodedPost.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientChunkEncodedPost.java
@@ -31,11 +31,11 @@ import java.io.FileInputStream;
 
 import org.apache.hc.client5.http.classic.methods.HttpPost;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.io.entity.InputStreamEntity;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * Example how to use unbuffered chunk-encoded POST request.
@@ -63,11 +63,12 @@ public class ClientChunkEncodedPost {
             httppost.setEntity(reqEntity);
 
             System.out.println("Executing request " + httppost.getMethod() + " " + httppost.getUri());
-            try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            httpclient.execute(httppost, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-            }
+                System.out.println(httppost + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java
index 5c900af..a3c608d 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java
@@ -50,7 +50,6 @@ import org.apache.hc.client5.http.cookie.CookieStore;
 import org.apache.hc.client5.http.cookie.StandardCookieSpec;
 import org.apache.hc.client5.http.impl.auth.CredentialsProviderBuilder;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.io.ManagedHttpClientConnectionFactory;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
@@ -81,6 +80,7 @@ import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.message.BasicHeader;
 import org.apache.hc.core5.http.message.BasicLineParser;
 import org.apache.hc.core5.http.message.LineParser;
+import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.http.ssl.TLS;
 import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
 import org.apache.hc.core5.pool.PoolReusePolicy;
@@ -238,29 +238,24 @@ public class ClientConfiguration {
             context.setCredentialsProvider(credentialsProvider);
 
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
-            try (final CloseableHttpResponse response = httpclient.execute(httpget, context)) {
+            httpclient.execute(httpget, context, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-
-                // Once the request has been executed the local context can
-                // be used to examine updated state and various objects affected
-                // by the request execution.
-
-                // Last executed request
-                context.getRequest();
-                // Execution route
-                context.getHttpRoute();
-                // Auth exchanges
-                context.getAuthExchanges();
-                // Cookie origin
-                context.getCookieOrigin();
-                // Cookie spec used
-                context.getCookieSpec();
-                // User security token
-                context.getUserToken();
-
-            }
+                System.out.println(httpget + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
+            // Last executed request
+            context.getRequest();
+            // Execution route
+            context.getHttpRoute();
+            // Auth exchanges
+            context.getAuthExchanges();
+            // Cookie origin
+            context.getCookieOrigin();
+            // Cookie spec used
+            context.getCookieSpec();
+            // User security token
+            context.getUserToken();
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionConfig.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionConfig.java
index bcbd209..a72d6af 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionConfig.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionConfig.java
@@ -29,7 +29,6 @@ package org.apache.hc.client5.http.examples;
 import org.apache.hc.client5.http.config.ConnectionConfig;
 import org.apache.hc.client5.http.config.TlsConfig;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
@@ -92,10 +91,12 @@ public class ClientConnectionConfig {
                         .setPath("/headers")
                         .build();
                 System.out.println("Executing request " + request);
-                try (CloseableHttpResponse response = httpclient.execute(request)) {
+                httpclient.execute(request, response -> {
+                    System.out.println("----------------------------------------");
                     System.out.println(request + "->" + new StatusLine(response));
                     EntityUtils.consume(response.getEntity());
-                }
+                    return null;
+                });
             }
         }
     }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionRelease.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionRelease.java
deleted file mode 100644
index 648160b..0000000
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConnectionRelease.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.examples;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.core5.http.HttpEntity;
-
-/**
- * This example demonstrates the recommended way of using API to make sure
- * the underlying connection gets released back to the connection manager.
- */
-public class ClientConnectionRelease {
-
-    public final static void main(final String[] args) throws Exception {
-        try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
-            final HttpGet httpget = new HttpGet("http://httpbin.org/get");
-
-            System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
-            try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
-                System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-
-                // Get hold of the response entity
-                final HttpEntity entity = response.getEntity();
-
-                // If the response does not enclose an entity, there is no need
-                // to bother about connection release
-                if (entity != null) {
-                    try (final InputStream inStream = entity.getContent()) {
-                        inStream.read();
-                        // do something useful with the response
-                    } catch (final IOException ex) {
-                        // In case of an IOException the connection will be released
-                        // back to the connection manager automatically
-                        throw ex;
-                    }
-                }
-            }
-        }
-    }
-
-}
-
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java
index 8ef79df..a7eefb2 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java
@@ -34,10 +34,10 @@ import org.apache.hc.client5.http.cookie.BasicCookieStore;
 import org.apache.hc.client5.http.cookie.Cookie;
 import org.apache.hc.client5.http.cookie.CookieStore;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * This example demonstrates the use of a local HTTP context populated with
@@ -59,15 +59,16 @@ public class ClientCustomContext {
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
 
             // Pass local context as a parameter
-            try (final CloseableHttpResponse response = httpclient.execute(httpget, localContext)) {
+            httpclient.execute(httpget, localContext, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
+                System.out.println(httpget + "->" + new StatusLine(response));
                 final List<Cookie> cookies = cookieStore.getCookies();
                 for (int i = 0; i < cookies.size(); i++) {
                     System.out.println("Local cookie: " + cookies.get(i));
                 }
                 EntityUtils.consume(response.getEntity());
-            }
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java
index b1e53d6..37be073 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java
@@ -29,10 +29,9 @@ package org.apache.hc.client5.http.examples;
 import java.net.URL;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.cookie.StandardCookieSpec;
 import org.apache.hc.client5.http.cookie.CookieSpecFactory;
+import org.apache.hc.client5.http.cookie.StandardCookieSpec;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.cookie.RFC6265CookieSpecFactory;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
@@ -44,6 +43,7 @@ import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
 import org.apache.hc.core5.http.config.Lookup;
 import org.apache.hc.core5.http.config.RegistryBuilder;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.ssl.SSLContexts;
 
 /**
@@ -81,11 +81,12 @@ public class ClientCustomPublicSuffixList {
 
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
 
-            try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
+            httpclient.execute(httpget, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-            }
+                System.out.println(httpget + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java
index 88382d3..18f6568 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java
@@ -34,7 +34,6 @@ import javax.net.ssl.SSLSession;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.config.TlsConfig;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
 import org.apache.hc.client5.http.io.HttpClientConnectionManager;
@@ -42,6 +41,7 @@ import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
 import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.http.ssl.TLS;
 import org.apache.hc.core5.ssl.SSLContexts;
 import org.apache.hc.core5.util.Timeout;
@@ -80,17 +80,17 @@ public class ClientCustomSSL {
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
 
             final HttpClientContext clientContext = HttpClientContext.create();
-            try (CloseableHttpResponse response = httpclient.execute(httpget, clientContext)) {
+            httpclient.execute(httpget, clientContext, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-
+                System.out.println(httpget + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
                 final SSLSession sslSession = clientContext.getSSLSession();
                 if (sslSession != null) {
                     System.out.println("SSL protocol " + sslSession.getProtocol());
                     System.out.println("SSL cipher suite " + sslSession.getCipherSuite());
                 }
-            }
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientEvictExpiredConnections.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientEvictExpiredConnections.java
index 338a52a..847ceeb 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientEvictExpiredConnections.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientEvictExpiredConnections.java
@@ -28,10 +28,10 @@ package org.apache.hc.client5.http.examples;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.pool.PoolStats;
 import org.apache.hc.core5.util.TimeValue;
 
@@ -61,11 +61,12 @@ public class ClientEvictExpiredConnections {
 
                 System.out.println("Executing request " + request.getMethod() + " " + request.getRequestUri());
 
-                try (final CloseableHttpResponse response = httpclient.execute(request)) {
+                httpclient.execute(request, response -> {
                     System.out.println("----------------------------------------");
-                    System.out.println(response.getCode() + " " + response.getReasonPhrase());
+                    System.out.println(request + "->" + new StatusLine(response));
                     EntityUtils.consume(response.getEntity());
-                }
+                    return null;
+                });
             }
 
             final PoolStats stats1 = cm.getTotalStats();
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteProxy.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteProxy.java
index 9cf66ce..85e8185 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteProxy.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteProxy.java
@@ -30,10 +30,10 @@ package org.apache.hc.client5.http.examples;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.config.RequestConfig;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * How to send a request via proxy.
@@ -57,11 +57,12 @@ public class ClientExecuteProxy {
             System.out.println("Executing request " + request.getMethod() + " " + request.getUri() +
                     " via " + proxy);
 
-            try (final CloseableHttpResponse response = httpclient.execute(target, request)) {
+            httpclient.execute(request, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-            }
+                System.out.println(request + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteSOCKS.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteSOCKS.java
index 93bbca7..4471404 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteSOCKS.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteSOCKS.java
@@ -34,15 +34,16 @@ import java.net.Socket;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
-import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
 import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.config.Registry;
 import org.apache.hc.core5.http.config.RegistryBuilder;
+import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.util.TimeValue;
 
@@ -57,24 +58,27 @@ public class ClientExecuteSOCKS {
         final Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
                 .register("http", new MyConnectionSocketFactory())
                 .build();
-        final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);
+        final InetSocketAddress socksaddr = new InetSocketAddress("mysockshost", 1234);
+        final PoolingHttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
+                .setDefaultSocketConfig(SocketConfig.custom()
+                        .setSocksProxyAddress(socksaddr)
+                        .build())
+                .build();
         try (final CloseableHttpClient httpclient = HttpClients.custom()
                 .setConnectionManager(cm)
                 .build()) {
-            final InetSocketAddress socksaddr = new InetSocketAddress("mysockshost", 1234);
-            final HttpClientContext context = HttpClientContext.create();
-            context.setAttribute("socks.address", socksaddr);
 
             final HttpHost target = new HttpHost("http", "httpbin.org", 80);
             final HttpGet request = new HttpGet("/get");
 
             System.out.println("Executing request " + request.getMethod() + " " + request.getUri() +
                     " via SOCKS proxy " + socksaddr);
-            try (final CloseableHttpResponse response = httpclient.execute(target, request, context)) {
+            httpclient.execute(target, request, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-            }
+                System.out.println(request + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
index cf3d737..0a580ad 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
@@ -33,10 +33,8 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.cookie.BasicCookieStore;
 import org.apache.hc.client5.http.cookie.Cookie;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
 
@@ -52,11 +50,10 @@ public class ClientFormLogin {
                 .setDefaultCookieStore(cookieStore)
                 .build()) {
             final HttpGet httpget = new HttpGet("https://someportal/");
-            try (final CloseableHttpResponse response1 = httpclient.execute(httpget)) {
-                final HttpEntity entity = response1.getEntity();
-
-                System.out.println("Login form get: " + response1.getCode() + " " + response1.getReasonPhrase());
-                EntityUtils.consume(entity);
+            httpclient.execute(httpget, response -> {
+                System.out.println("----------------------------------------");
+                System.out.println("Login form get: " + response.getCode() + " " + response.getReasonPhrase());
+                EntityUtils.consume(response.getEntity());
 
                 System.out.println("Initial set of cookies:");
                 final List<Cookie> cookies = cookieStore.getCookies();
@@ -67,18 +64,18 @@ public class ClientFormLogin {
                         System.out.println("- " + cookies.get(i));
                     }
                 }
-            }
+                return null;
+            });
 
             final ClassicHttpRequest login = ClassicRequestBuilder.post()
                     .setUri(new URI("https://someportal/"))
                     .addParameter("IDToken1", "username")
                     .addParameter("IDToken2", "password")
                     .build();
-            try (final CloseableHttpResponse response2 = httpclient.execute(login)) {
-                final HttpEntity entity = response2.getEntity();
-
-                System.out.println("Login form get: " + response2.getCode() + " " + response2.getReasonPhrase());
-                EntityUtils.consume(entity);
+            httpclient.execute(httpget, response -> {
+                System.out.println("----------------------------------------");
+                System.out.println("Login form get: " + response.getCode() + " " + response.getReasonPhrase());
+                EntityUtils.consume(response.getEntity());
 
                 System.out.println("Post logon cookies:");
                 final List<Cookie> cookies = cookieStore.getCookies();
@@ -89,7 +86,8 @@ public class ClientFormLogin {
                         System.out.println("- " + cookies.get(i));
                     }
                 }
-            }
+                return null;
+            });
         }
     }
 }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientInterceptors.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientInterceptors.java
index 61514b0..3a5c2e6 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientInterceptors.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientInterceptors.java
@@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.ChainElement;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentType;
@@ -46,6 +45,7 @@ import org.apache.hc.core5.http.HttpStatus;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.io.entity.StringEntity;
 import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
+import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.http.protocol.HttpContext;
 
 /**
@@ -92,11 +92,12 @@ public class ClientInterceptors {
 
                 System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
 
-                try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
+                httpclient.execute(httpget, response -> {
                     System.out.println("----------------------------------------");
-                    System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                    System.out.println(EntityUtils.toString(response.getEntity()));
-                }
+                    System.out.println(httpget + "->" + new StatusLine(response));
+                    EntityUtils.consume(response.getEntity());
+                    return null;
+                });
             }
         }
     }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultiThreadedExecution.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultiThreadedExecution.java
index ba26684..057a875 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultiThreadedExecution.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultiThreadedExecution.java
@@ -28,7 +28,6 @@ package org.apache.hc.client5.http.examples;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.apache.hc.core5.http.HttpEntity;
@@ -103,7 +102,7 @@ public class ClientMultiThreadedExecution {
         public void run() {
             try {
                 System.out.println(id + " - about to get something from " + httpget.getUri());
-                try (CloseableHttpResponse response = httpClient.execute(httpget, context)) {
+                this.httpClient.execute(httpget, response -> {
                     System.out.println(id + " - get executed");
                     // get the response body as an array of bytes
                     final HttpEntity entity = response.getEntity();
@@ -111,7 +110,8 @@ public class ClientMultiThreadedExecution {
                         final byte[] bytes = EntityUtils.toByteArray(entity);
                         System.out.println(id + " - " + bytes.length + " bytes read");
                     }
-                }
+                    return null;
+                });
             } catch (final Exception e) {
                 System.out.println(id + " - error: " + e);
             }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultipartFormPost.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultipartFormPost.java
index 4d5a8f3..79f382f 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultipartFormPost.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientMultipartFormPost.java
@@ -33,11 +33,11 @@ import org.apache.hc.client5.http.entity.mime.FileBody;
 import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
 import org.apache.hc.client5.http.entity.mime.StringBody;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * Example how to use multipart/form encoded POST request.
@@ -65,15 +65,16 @@ public class ClientMultipartFormPost {
             httppost.setEntity(reqEntity);
 
             System.out.println("executing request " + httppost);
-            try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            httpclient.execute(httppost, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response);
+                System.out.println(httppost + "->" + new StatusLine(response));
                 final HttpEntity resEntity = response.getEntity();
                 if (resEntity != null) {
                     System.out.println("Response content length: " + resEntity.getContentLength());
                 }
-                EntityUtils.consume(resEntity);
-            }
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveBasicAuthentication.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveBasicAuthentication.java
index 7b71f82..8799912 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveBasicAuthentication.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveBasicAuthentication.java
@@ -30,11 +30,11 @@ import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.auth.BasicScheme;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * An example of how HttpClient can be customized to authenticate
@@ -63,11 +63,12 @@ public class ClientPreemptiveBasicAuthentication {
 
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
             for (int i = 0; i < 3; i++) {
-                try (final CloseableHttpResponse response = httpclient.execute(httpget, localContext)) {
+                httpclient.execute(httpget, localContext, response -> {
                     System.out.println("----------------------------------------");
-                    System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                    System.out.println(EntityUtils.toString(response.getEntity()));
-                }
+                    System.out.println(httpget + "->" + new StatusLine(response));
+                    EntityUtils.consume(response.getEntity());
+                    return null;
+                });
             }
         }
     }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveDigestAuthentication.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveDigestAuthentication.java
index 0dbc463..69b3a04 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveDigestAuthentication.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientPreemptiveDigestAuthentication.java
@@ -33,11 +33,11 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.auth.CredentialsProviderBuilder;
 import org.apache.hc.client5.http.impl.auth.DigestScheme;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * An example of how HttpClient can authenticate multiple requests
@@ -61,9 +61,9 @@ public class ClientPreemptiveDigestAuthentication {
 
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
             for (int i = 0; i < 3; i++) {
-                try (final CloseableHttpResponse response = httpclient.execute(target, httpget, localContext)) {
+                httpclient.execute(httpget, localContext, response -> {
                     System.out.println("----------------------------------------");
-                    System.out.println(response.getCode() + " " + response.getReasonPhrase());
+                    System.out.println(httpget + "->" + new StatusLine(response));
                     EntityUtils.consume(response.getEntity());
 
                     final AuthExchange authExchange = localContext.getAuthExchange(target);
@@ -75,7 +75,8 @@ public class ClientPreemptiveDigestAuthentication {
                                     "; count: " + digestScheme.getNounceCount());
                         }
                     }
-                }
+                    return null;
+                });
             }
         }
     }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientProxyAuthentication.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientProxyAuthentication.java
index d237029..108495b 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientProxyAuthentication.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientProxyAuthentication.java
@@ -32,10 +32,10 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.config.RequestConfig;
 import org.apache.hc.client5.http.impl.auth.CredentialsProviderBuilder;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
  * A simple example that uses HttpClient to execute an HTTP request
@@ -63,11 +63,12 @@ public class ClientProxyAuthentication {
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri() +
                     " via " + proxy);
 
-            try (final CloseableHttpResponse response = httpclient.execute(target, httpget)) {
+            httpclient.execute(httpget, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                System.out.println(EntityUtils.toString(response.getEntity()));
-            }
+                System.out.println(httpget + "->" + new StatusLine(response));
+                EntityUtils.consume(response.getEntity());
+                return null;
+            });
         }
     }
 }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java
similarity index 67%
copy from httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java
copy to httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java
index 55ab2fd..ad7c455 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientAbortMethod.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java
@@ -29,28 +29,43 @@ package org.apache.hc.client5.http.examples;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.message.StatusLine;
 
 /**
- * This example demonstrates how to abort an HTTP method before its normal completion.
+ * This example demonstrates the recommended way of processing the HTTP response and releasing
+ * associated resources.
  */
-public class ClientAbortMethod {
+public class ClientResponseProcessing {
 
     public static void main(final String[] args) throws Exception {
         try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
             final HttpGet httpget = new HttpGet("http://httpbin.org/get");
 
             System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
-            try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
+
+            final Result result = httpclient.execute(httpget, response -> {
                 System.out.println("----------------------------------------");
-                System.out.println(response.getCode() + " " + response.getReasonPhrase());
-                // Do not feel like reading the response body
-                // Call cancel on the request object
-                httpget.cancel();
-            }
+                System.out.println(httpget + "->" + new StatusLine(response));
+                // Process response message and convert it into a value object
+                return new Result(response.getCode(), EntityUtils.toString(response.getEntity()));
+            });
+            System.out.println(result);
         }
     }
 
+    static class Result {
+
+        final int status;
+        final String content;
+
+        Result(final int status, final String content) {
+            this.status = status;
+            this.content = content;
+        }
+
+    }
+
 }
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientWithResponseHandler.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientWithResponseHandler.java
deleted file mode 100644
index d9a4406..0000000
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientWithResponseHandler.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.examples;
-
-import org.apache.hc.client5.http.ClientProtocolException;
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.core5.http.HttpEntity;
-import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.ParseException;
-import org.apache.hc.core5.http.io.HttpClientResponseHandler;
-import org.apache.hc.core5.http.io.entity.EntityUtils;
-
-/**
- * This example demonstrates the use of the {@link HttpClientResponseHandler} to simplify
- * the process of processing the HTTP response and releasing associated resources.
- */
-public class ClientWithResponseHandler {
-
-    public static void main(final String[] args) throws Exception {
-        try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
-            final HttpGet httpget = new HttpGet("http://httpbin.org/get");
-
-            System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
-
-            // Create a custom response handler
-            final HttpClientResponseHandler<String> responseHandler = response -> {
-                final int status = response.getCode();
-                if (status >= HttpStatus.SC_SUCCESS && status < HttpStatus.SC_REDIRECTION) {
-                    final HttpEntity entity = response.getEntity();
-                    try {
-                        return entity != null ? EntityUtils.toString(entity) : null;
-                    } catch (final ParseException ex) {
-                        throw new ClientProtocolException(ex);
-                    }
-                } else {
-                    throw new ClientProtocolException("Unexpected response status: " + status);
-                }
-            };
-            final String responseBody = httpclient.execute(httpget, responseHandler);
-            System.out.println("----------------------------------------");
-            System.out.println(responseBody);
-        }
-    }
-
-}
-
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestHttpClientBuilderInterceptors.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestHttpClientBuilderInterceptors.java
index bbce383..bee13b1 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestHttpClientBuilderInterceptors.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestHttpClientBuilderInterceptors.java
@@ -32,11 +32,12 @@ import org.apache.hc.client5.http.classic.methods.HttpPost;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
 import org.apache.hc.client5.http.io.HttpClientConnectionManager;
 import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
 import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.io.CloseMode;
 import org.junit.After;
 import org.junit.Assert;
@@ -84,7 +85,10 @@ public class TestHttpClientBuilderInterceptors {
     @Test
     public void testAddExecInterceptorLastShouldBeExecuted() throws IOException, HttpException {
         final ClassicHttpRequest request = new HttpPost(uri);
-        final ClassicHttpResponse response = httpClient.execute(request);
+        final HttpResponse response = httpClient.execute(request, httpResponse -> {
+            EntityUtils.consume(httpResponse.getEntity());
+            return httpResponse;
+        });
         Assert.assertEquals(200, response.getCode());
         final Header testFilterHeader = response.getHeader("X-Test-Interceptor");
         Assert.assertNotNull(testFilterHeader);