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 2026/10/14 12:44:25 UTC

(httpcomponents-client) branch master updated: Always use maxResultLength constraint with EntityUtils#toByteArray and EntityUtils#toString

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4456b34c7 Always use maxResultLength constraint with EntityUtils#toByteArray and EntityUtils#toString
4456b34c7 is described below

commit 4456b34c78ad1dacd08a2e3e2da94f24ecc49642
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Wed Oct 14 14:37:20 2026 +0200

    Always use maxResultLength constraint with EntityUtils#toByteArray and EntityUtils#toString
---
 .../hc/client5/http/impl/cache/TestCachingExecChain.java  |  2 +-
 .../hc/client5/http/impl/cache/TestCombinedEntity.java    |  2 +-
 .../hc/client5/http/fluent/ContentResponseHandler.java    |  4 ++--
 .../java/org/apache/hc/client5/http/fluent/Executor.java  |  1 -
 .../java/org/apache/hc/client5/http/fluent/Response.java  |  2 +-
 .../hc/client5/http/rest/RestClientBuilderTest.java       |  4 ++--
 .../apache/hc/client5/testing/classic/EchoHandler.java    |  2 +-
 .../hc/client5/testing/TestValidateAfterInactivity.java   |  5 +++--
 .../hc/client5/testing/async/TestClassicOverAsync.java    |  8 ++++----
 .../client5/testing/async/TestClassicOverAsyncHttp1.java  |  2 +-
 .../org/apache/hc/client5/testing/fluent/TestFluent.java  |  2 +-
 .../hc/client5/testing/sync/TestConnectionTimeouts.java   |  5 +++--
 .../hc/client5/testing/sync/TestContentCodings.java       | 15 ++++++++-------
 .../org/apache/hc/client5/testing/sync/TestRedirects.java |  2 +-
 .../apache/hc/client5/testing/sync/TestSocketTimeout.java |  8 +++++---
 .../http/impl/classic/BasicHttpClientResponseHandler.java |  4 ++++
 .../hc/client5/http/entity/TestDecompressingEntity.java   |  4 ++--
 .../org/apache/hc/client5/http/entity/TestDeflate.java    |  4 ++--
 .../apache/hc/client5/http/entity/TestEntityBuilder.java  |  2 +-
 .../java/org/apache/hc/client5/http/entity/TestGZip.java  |  8 ++++----
 .../http/examples/ClientMultiThreadedExecution.java       |  6 +-----
 .../hc/client5/http/examples/ClientQueryMethod.java       |  2 +-
 .../client5/http/examples/ClientResponseProcessing.java   |  2 +-
 .../http/examples/ClientServerCompressionExample.java     |  2 +-
 .../classic/TestAbstractHttpClientResponseHandler.java    |  3 +++
 .../http/impl/classic/TestBasicResponseHandler.java       |  3 +++
 26 files changed, 57 insertions(+), 47 deletions(-)

diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java
index a9265e5eb..603a4c325 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java
@@ -1117,7 +1117,7 @@ public int read() throws IOException {
 
         Assertions.assertThrows(SocketTimeoutException.class, () -> {
             final ClassicHttpResponse result1 = execute(req1);
-            EntityUtils.toString(result1.getEntity());
+            EntityUtils.toString(result1.getEntity(), 1000);
         });
     }
 
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCombinedEntity.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCombinedEntity.java
index abb6aa50b..8a11c1856 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCombinedEntity.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCombinedEntity.java
@@ -54,7 +54,7 @@ void testCombinedEntityBasics() throws Exception {
         Assertions.assertFalse(entity.isRepeatable());
         Assertions.assertTrue(entity.isStreaming());
 
-        Assertions.assertArrayEquals(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, EntityUtils.toByteArray(entity));
+        Assertions.assertArrayEquals(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, EntityUtils.toByteArray(entity, 1000));
 
         verify(httpEntity).getContent();
 
diff --git a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/ContentResponseHandler.java b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/ContentResponseHandler.java
index 102c6454b..df1f84747 100644
--- a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/ContentResponseHandler.java
+++ b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/ContentResponseHandler.java
@@ -54,7 +54,7 @@ public class ContentResponseHandler extends AbstractHttpClientResponseHandler<Co
     @Override
     public Content handleEntity(final HttpEntity entity) throws IOException {
         return entity != null ?
-                new Content(EntityUtils.toByteArray(entity), ContentType.parse(entity.getContentType())) :
+                new Content(EntityUtils.toByteArray(entity, Integer.MAX_VALUE), ContentType.parse(entity.getContentType())) :
                 Content.NO_CONTENT;
     }
 
@@ -76,6 +76,6 @@ public Content handleResponse(final ClassicHttpResponse response) throws IOExcep
         if (statusCode >= 300) {
             throw new HttpResponseException(statusCode, response.getReasonPhrase(), entity != null ? EntityUtils.toByteArray(entity, MAX_MESSAGE_LENGTH) : null, contentType);
         }
-        return new Content(entity != null ? EntityUtils.toByteArray(entity) : new byte[] {}, contentType);
+        return new Content(entity != null ? EntityUtils.toByteArray(entity, Integer.MAX_VALUE) : new byte[] {}, contentType);
     }
 }
diff --git a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java
index a1adb84a9..c1bb154e5 100644
--- a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java
+++ b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java
@@ -111,7 +111,6 @@ static CloseableHttpClient GET_ASYNC_CLIENT() {
                                         .build())
                                 .build())
                         .evictExpiredConnections()
-                        .evictIdleConnections(TimeValue.ofMinutes(1))
                         .build(), Timeout.ofMinutes(5));
             }
             return ASYNC_CLIENT;
diff --git a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Response.java b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Response.java
index 85660aeac..2d40272f3 100644
--- a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Response.java
+++ b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Response.java
@@ -118,7 +118,7 @@ public HttpResponse returnResponse() throws IOException {
             return ClassicResponseBuilder.copy(response)
                     .setEntity(entity != null ?
                             new ByteArrayEntity(
-                                    EntityUtils.toByteArray(entity),
+                                    EntityUtils.toByteArray(entity, Integer.MAX_VALUE),
                                     ContentType.parse(entity.getContentType()))
                             : null)
                     .build();
diff --git a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientBuilderTest.java b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientBuilderTest.java
index 39bd2b4a4..1db236e1b 100644
--- a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientBuilderTest.java
+++ b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientBuilderTest.java
@@ -383,7 +383,7 @@ static void setUp() throws Exception {
                 .register("/echobody",
                         (request, response, context) -> {
                             final byte[] body =
-                                    EntityUtils.toByteArray(request.getEntity());
+                                    EntityUtils.toByteArray(request.getEntity(), 1000);
                             response.setCode(200);
                             response.setEntity(new ByteArrayEntity(body,
                                     ContentType.APPLICATION_OCTET_STREAM));
@@ -409,7 +409,7 @@ static void setUp() throws Exception {
                 .register("/json",
                         (request, response, context) -> {
                             final String body =
-                                    EntityUtils.toString(request.getEntity());
+                                    EntityUtils.toString(request.getEntity(), 1000);
                             response.setCode(201);
                             response.setEntity(new StringEntity(
                                     body, ContentType.APPLICATION_JSON));
diff --git a/httpclient5-testing/src/main/java/org/apache/hc/client5/testing/classic/EchoHandler.java b/httpclient5-testing/src/main/java/org/apache/hc/client5/testing/classic/EchoHandler.java
index 596872509..03bd4fadc 100644
--- a/httpclient5-testing/src/main/java/org/apache/hc/client5/testing/classic/EchoHandler.java
+++ b/httpclient5-testing/src/main/java/org/apache/hc/client5/testing/classic/EchoHandler.java
@@ -83,7 +83,7 @@ public void handle(final ClassicHttpRequest request,
             data = new byte [0];
             contentType = null;
         } else {
-            data = EntityUtils.toByteArray(entity);
+            data = EntityUtils.toByteArray(entity, Integer.MAX_VALUE);
             final String contentTypeStr = entity.getContentType();
             contentType = contentTypeStr == null ? null : ContentType.parse(contentTypeStr);
         }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/TestValidateAfterInactivity.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/TestValidateAfterInactivity.java
index 1ec1d31b0..0c79b5af8 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/TestValidateAfterInactivity.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/TestValidateAfterInactivity.java
@@ -35,13 +35,13 @@
 import org.apache.hc.client5.http.config.ConnectionConfig;
 import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
 import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
-import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
 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.nio.PoolingAsyncClientConnectionManager;
 import org.apache.hc.client5.testing.TestValidateAfterInactivity.TcpReset;
 import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -184,7 +184,8 @@ private void sendPing(final CloseableHttpClient client) throws URISyntaxExceptio
         final HttpHost target = new HttpHost("localhost", port);
         final URI requestUri = new URI("/ping");
 
-        final String response = client.execute(target, new HttpGet(requestUri), new BasicHttpClientResponseHandler());
+        final String response = client.execute(target, new HttpGet(requestUri), message ->
+                EntityUtils.toString(message.getEntity(), 1000));
 
         assertEquals("OK", response);
     }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsync.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsync.java
index 08736af52..6d0657b73 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsync.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsync.java
@@ -135,7 +135,7 @@ void testSequentialGetRequests(final int contentSize) throws Exception {
                             .build(),
                     response -> {
                         Assertions.assertEquals(200, response.getCode());
-                        final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
+                        final byte[] bytes = EntityUtils.toByteArray(response.getEntity(), contentSize);
                         Assertions.assertNotNull(bytes);
                         Assertions.assertEquals(contentSize, bytes.length);
                         return null;
@@ -274,7 +274,7 @@ void testConcurrentGetRequests(final int contentSize) throws Exception {
                     return client.execute(
                             request,
                             response -> {
-                                final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
+                                final byte[] bytes = EntityUtils.toByteArray(response.getEntity(), contentSize);
                                 countDownLatch.countDown();
                                 return new Result<>(request, response, bytes);
                             });
@@ -318,7 +318,7 @@ void testSequentialPostRequests(final int contentSize) throws Exception {
                             .build(),
                     response -> {
                         Assertions.assertEquals(200, response.getCode());
-                        final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
+                        final byte[] bytes = EntityUtils.toByteArray(response.getEntity(), contentSize);
                         Assertions.assertNotNull(bytes);
                         Assertions.assertArrayEquals(temp, bytes);
                         return null;
@@ -353,7 +353,7 @@ void testConcurrentPostRequests(final int contentSize) throws Exception {
                     return client.execute(
                             request,
                             response -> {
-                                final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
+                                final byte[] bytes = EntityUtils.toByteArray(response.getEntity(), contentSize);
                                 countDownLatch.countDown();
                                 return new Result<>(request, response, bytes);
                             });
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsyncHttp1.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsyncHttp1.java
index 8f6ba5bf0..815b36ffb 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsyncHttp1.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestClassicOverAsyncHttp1.java
@@ -72,7 +72,7 @@ void testSequentialPostRequestsNoKeepAlive(final int contentSize) throws Excepti
                             .build(),
                     response -> {
                         Assertions.assertEquals(200, response.getCode());
-                        final byte[] bytes = EntityUtils.toByteArray(response.getEntity());
+                        final byte[] bytes = EntityUtils.toByteArray(response.getEntity(), contentSize);
                         Assertions.assertNotNull(bytes);
                         Assertions.assertArrayEquals(temp, bytes);
                         return null;
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/fluent/TestFluent.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/fluent/TestFluent.java
index 2c0f366f2..2bb1a44e6 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/fluent/TestFluent.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/fluent/TestFluent.java
@@ -71,7 +71,7 @@ void setUp() {
                         final ContentType contentType = contentTypeStr == null ? ContentType.DEFAULT_TEXT : ContentType.parse(contentTypeStr);
                         if (ContentType.TEXT_PLAIN.getMimeType().equals(contentType.getMimeType())) {
                             responseEntity = new StringEntity(
-                                    EntityUtils.toString(requestEntity), ContentType.TEXT_PLAIN);
+                                    EntityUtils.toString(requestEntity, 1000), ContentType.TEXT_PLAIN);
                         }
                     }
                     if (responseEntity == null) {
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionTimeouts.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionTimeouts.java
index cfe9bef19..34d4fdd85 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionTimeouts.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionTimeouts.java
@@ -32,11 +32,11 @@
 import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
 import org.apache.hc.client5.http.config.ConnectionConfig;
 import org.apache.hc.client5.http.config.RequestConfig;
-import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
 import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Timeout;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -84,7 +84,8 @@ private static HttpUriRequestBase getRequest(final String scheme) {
 
     private static void assertTimeout(final HttpUriRequestBase request, final CloseableHttpClient client) {
         final ConnectTimeoutException ex = assertThrows(ConnectTimeoutException.class,
-            () -> client.execute(request, new BasicHttpClientResponseHandler()));
+            () -> client.execute(request, response ->
+                    EntityUtils.toString(response.getEntity(), 1000)));
         // Capitalization (`connect` vs `Connect`) varies by Java version
         assertTrue(ex.getMessage().toLowerCase().contains("connect timed out"), ex.getMessage());
     }
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 6cc1791d3..61eedcbba 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
@@ -41,7 +41,6 @@
 import java.util.zip.GZIPOutputStream;
 
 import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.apache.hc.client5.testing.extension.sync.ClientProtocolLevel;
@@ -116,7 +115,7 @@ void testDeflateSupportForServerReturningRfc1950Stream() throws Exception {
 
         final HttpGet request = new HttpGet("/some-resource");
         client.execute(target, request, response -> {
-            Assertions.assertEquals(entityText, EntityUtils.toString(response.getEntity()),
+            Assertions.assertEquals(entityText, EntityUtils.toString(response.getEntity(), 1000),
                     "The entity text is correctly transported");
             return null;
         });
@@ -141,7 +140,7 @@ void testDeflateSupportForServerReturningRfc1951Stream() throws Exception {
 
         final HttpGet request = new HttpGet("/some-resource");
         client.execute(target, request, response -> {
-            Assertions.assertEquals(entityText, EntityUtils.toString(response.getEntity()),
+            Assertions.assertEquals(entityText, EntityUtils.toString(response.getEntity(), 1000),
                     "The entity text is correctly transported");
             return null;
         });
@@ -165,7 +164,7 @@ void testGzipSupport() throws Exception {
 
         final HttpGet request = new HttpGet("/some-resource");
         client.execute(target, request, response -> {
-            Assertions.assertEquals(entityText, EntityUtils.toString(response.getEntity()),
+            Assertions.assertEquals(entityText, EntityUtils.toString(response.getEntity(), 1000),
                     "The entity text is correctly transported");
             return null;
         });
@@ -280,7 +279,8 @@ void gzipResponsesWorkWithBasicResponseHandler() throws Exception {
         final TestClient client = client();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final String response = client.execute(target, request, new BasicHttpClientResponseHandler());
+        final String response = client.execute(target, request, message ->
+                EntityUtils.toString(message.getEntity(), 1000));
         Assertions.assertEquals(entityText, response, "The entity text is correctly transported");
     }
 
@@ -296,7 +296,8 @@ void deflateResponsesWorkWithBasicResponseHandler() throws Exception {
         final TestClient client = client();
 
         final HttpGet request = new HttpGet("/some-resource");
-        final String response = client.execute(target, request, new BasicHttpClientResponseHandler());
+        final String response = client.execute(target, request, message ->
+                EntityUtils.toString(message.getEntity(), 1000));
         Assertions.assertEquals(entityText, response, "The entity text is correctly transported");
     }
 
@@ -441,7 +442,7 @@ public void run() {
                 startGate.await();
                 try {
                     text = client.execute(target, request, response ->
-                            EntityUtils.toString(response.getEntity()));
+                            EntityUtils.toString(response.getEntity(), 1000));
                 } catch (final Exception e) {
                     failed = true;
                 } finally {
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 e99a0a0f3..8649e9e8e 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
@@ -861,7 +861,7 @@ void testQueryRedirectTemporary() throws Exception {
 
         client.execute(target, httpQuery, context, response -> {
             Assertions.assertEquals(HttpStatus.SC_OK, response.getCode());
-            Assertions.assertEquals("stuff", EntityUtils.toString(response.getEntity()));
+            Assertions.assertEquals("stuff", EntityUtils.toString(response.getEntity(), 1000));
             return null;
         });
         final HttpRequest reqWrapper = context.getRequest();
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSocketTimeout.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSocketTimeout.java
index bb8caa2aa..d5dc69cc6 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSocketTimeout.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSocketTimeout.java
@@ -30,7 +30,6 @@
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.config.ConnectionConfig;
 import org.apache.hc.client5.http.config.RequestConfig;
-import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.apache.hc.client5.testing.classic.RandomHandler;
 import org.apache.hc.client5.testing.extension.sync.ClientProtocolLevel;
@@ -38,6 +37,7 @@
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.io.SocketConfig;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Timeout;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -87,12 +87,14 @@ void testReadTimeouts(final int socketConfigTimeout, final int connConfigTimeout
         for (final boolean drip : new boolean[]{ false, true }) {
             for (final boolean reuseConnection : new boolean[]{ false, true }) {
                 if (reuseConnection) {
-                    client.execute(target, getRequest(5000, 0, false), new BasicHttpClientResponseHandler());
+                    client.execute(target, getRequest(5000, 0, false), response ->
+                            EntityUtils.toString(response.getEntity(), 1000));
                 }
                 final HttpGet request = getRequest(responseTimeout, 2500, drip);
 
                 assertThrows(SocketTimeoutException.class, () ->
-                    client.execute(target, request, new BasicHttpClientResponseHandler()),
+                    client.execute(target, request, response ->
+                            EntityUtils.toString(response.getEntity(), 1000)),
                     String.format("drip=%s, reuseConnection=%s", drip, reuseConnection));
             }
         }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/BasicHttpClientResponseHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/BasicHttpClientResponseHandler.java
index 6269c0758..9736c302e 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/BasicHttpClientResponseHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/BasicHttpClientResponseHandler.java
@@ -50,8 +50,12 @@
  * HttpClient may handle redirects (3xx responses) internally.
  * </p>
  *
+ * @deprecated Use a custom {@link org.apache.hc.core5.http.io.HttpClientResponseHandler}
+ * that represents response content as a value object.
+ *
  * @since 4.0
  */
+@Deprecated
 @Contract(threading = ThreadingBehavior.STATELESS)
 public class BasicHttpClientResponseHandler extends AbstractHttpClientResponseHandler<String> {
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDecompressingEntity.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDecompressingEntity.java
index a24e050e6..b6ee4e3a6 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDecompressingEntity.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDecompressingEntity.java
@@ -53,7 +53,7 @@ void testNonStreaming() throws Exception {
         final StringEntity wrapped = new StringEntity("1234567890", StandardCharsets.US_ASCII);
         final ChecksumEntity entity = new ChecksumEntity(wrapped, crc32);
         Assertions.assertFalse(entity.isStreaming());
-        final String s = EntityUtils.toString(entity);
+        final String s = EntityUtils.toString(entity, 1000);
         Assertions.assertEquals("1234567890", s);
         Assertions.assertEquals(639479525L, crc32.getValue());
         final InputStream in1 = entity.getContent();
@@ -68,7 +68,7 @@ void testStreaming() throws Exception {
         final InputStreamEntity wrapped = new InputStreamEntity(in, -1, ContentType.DEFAULT_TEXT);
         final ChecksumEntity entity = new ChecksumEntity(wrapped, crc32);
         Assertions.assertTrue(entity.isStreaming());
-        final String s = EntityUtils.toString(entity);
+        final String s = EntityUtils.toString(entity, 1000);
         Assertions.assertEquals("1234567890", s);
         Assertions.assertEquals(639479525L, crc32.getValue());
         final InputStream in1 = entity.getContent();
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDeflate.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDeflate.java
index 2e40a1b73..f5f43ef1b 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDeflate.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestDeflate.java
@@ -61,7 +61,7 @@ void testCompressDecompress() throws Exception {
                 .decoder(ContentCoding.DEFLATE)
                 .apply(new ByteArrayEntity(compressed, 0, len, ContentType.APPLICATION_OCTET_STREAM));
 
-        Assertions.assertEquals(s, EntityUtils.toString(entity));
+        Assertions.assertEquals(s, EntityUtils.toString(entity, 1000));
     }
 
     @Test
@@ -82,7 +82,7 @@ void testEncodeThenDecode() throws Exception {
                 .decoder(ContentCoding.DEFLATE)
                 .apply(new ByteArrayEntity(buf.toByteArray(), ContentType.APPLICATION_OCTET_STREAM));
 
-        Assertions.assertEquals(text, EntityUtils.toString(decoded, StandardCharsets.US_ASCII));
+        Assertions.assertEquals(text, EntityUtils.toString(decoded, StandardCharsets.US_ASCII, 1000));
     }
 
 
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestEntityBuilder.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestEntityBuilder.java
index 8292251ac..e69b0b251 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestEntityBuilder.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestEntityBuilder.java
@@ -105,7 +105,7 @@ void testExplicitContentProperties() throws Exception {
         Assertions.assertEquals("application/json; charset=UTF-8", entity.getContentType());
         Assertions.assertNotNull(entity.getContentEncoding());
         Assertions.assertEquals("identity", entity.getContentEncoding());
-        Assertions.assertEquals("{\"stuff\"}", EntityUtils.toString(entity));
+        Assertions.assertEquals("{\"stuff\"}", EntityUtils.toString(entity, 1000));
     }
 
     @Test
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestGZip.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestGZip.java
index 95d3aac7b..2938af503 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestGZip.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/TestGZip.java
@@ -72,7 +72,7 @@ void testCompressionDecompression() throws Exception {
                     .decoder(ContentCoding.GZIP)
                     .apply(out);
             Assertions.assertEquals("some kind of text",
-                    EntityUtils.toString(gunzipe, StandardCharsets.US_ASCII));
+                    EntityUtils.toString(gunzipe, StandardCharsets.US_ASCII, 1000));
         }
     }
 
@@ -110,7 +110,7 @@ void testDecompressionWithMultipleGZipStream() throws Exception {
                 .apply(new InputStreamEntity(new ByteArrayInputStream(bytes),
                         ContentType.APPLICATION_OCTET_STREAM))) {
             Assertions.assertEquals("stream-1\nstream-2\n",
-                    EntityUtils.toString(entity, StandardCharsets.US_ASCII));
+                    EntityUtils.toString(entity, StandardCharsets.US_ASCII, 1000));
         }
     }
 
@@ -133,7 +133,7 @@ void testEncodeThenDecode() throws Exception {
                 .apply(new ByteArrayEntity(buf.toByteArray(),
                         ContentType.APPLICATION_OCTET_STREAM));
 
-        Assertions.assertEquals(txt, EntityUtils.toString(ungzip, StandardCharsets.US_ASCII));
+        Assertions.assertEquals(txt, EntityUtils.toString(ungzip, StandardCharsets.US_ASCII, 1000));
     }
 
     @Test
@@ -151,7 +151,7 @@ void testUnwrapHelper() throws Exception {
 
         Assertions.assertNotNull(decodedEntity, "unwrap returned null");
         Assertions.assertEquals("unwrap check",
-                EntityUtils.toString(decodedEntity, StandardCharsets.US_ASCII));
+                EntityUtils.toString(decodedEntity, StandardCharsets.US_ASCII, 1000));
     }
 
 }
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 411f7d959..f89144e91 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
@@ -30,10 +30,8 @@
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
 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.core5.http.HttpEntity;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
-import org.apache.hc.core5.http.protocol.HttpContext;
 
 /**
  * An example that performs GETs from multiple threads.
@@ -84,13 +82,11 @@ public static void main(final String[] args) throws Exception {
     static class GetThread extends Thread {
 
         private final CloseableHttpClient httpClient;
-        private final HttpContext context;
         private final HttpGet httpget;
         private final int id;
 
         public GetThread(final CloseableHttpClient httpClient, final HttpGet httpget, final int id) {
             this.httpClient = httpClient;
-            this.context = HttpClientContext.create();
             this.httpget = httpget;
             this.id = id;
         }
@@ -107,7 +103,7 @@ public void run() {
                     // get the response body as an array of bytes
                     final HttpEntity entity = response.getEntity();
                     if (entity != null) {
-                        final byte[] bytes = EntityUtils.toByteArray(entity);
+                        final byte[] bytes = EntityUtils.toByteArray(entity, Integer.MAX_VALUE);
                         System.out.println(id + " - " + bytes.length + " bytes read");
                     }
                     return null;
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientQueryMethod.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientQueryMethod.java
index 7cbda480a..c502792fd 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientQueryMethod.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientQueryMethod.java
@@ -49,7 +49,7 @@ public static void main(final String[] args) throws Exception {
             httpclient.execute(httpQuery, response -> {
                 System.out.println("----------------------------------------");
                 System.out.println(httpQuery + "->" + new StatusLine(response));
-                System.out.println(EntityUtils.toString(response.getEntity()));
+                System.out.println(EntityUtils.toString(response.getEntity(), 1000));
                 return null;
             });
         }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java
index ad7c45542..8f93dabaf 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientResponseProcessing.java
@@ -49,7 +49,7 @@ public static void main(final String[] args) throws Exception {
                 System.out.println("----------------------------------------");
                 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()));
+                return new Result(response.getCode(), EntityUtils.toString(response.getEntity(), 1000));
             });
             System.out.println(result);
         }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientServerCompressionExample.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientServerCompressionExample.java
index 76a579bb8..e11f3f539 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientServerCompressionExample.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientServerCompressionExample.java
@@ -111,7 +111,7 @@ public static void main(final String[] args) throws Exception {
 
             final String reply = client.execute(
                     post,
-                    rsp -> EntityUtils.toString(rsp.getEntity(), StandardCharsets.UTF_8));
+                    rsp -> EntityUtils.toString(rsp.getEntity(), StandardCharsets.UTF_8, 1000));
 
             System.out.println("Response: " + reply);
         } finally {
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestAbstractHttpClientResponseHandler.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestAbstractHttpClientResponseHandler.java
index 8351bc7ae..0cc0971cc 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestAbstractHttpClientResponseHandler.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestAbstractHttpClientResponseHandler.java
@@ -41,7 +41,10 @@
 
 /**
  * Unit tests for {@link BasicHttpClientResponseHandler}.
+ *
+ * @deprecated Should no longer be used.
  */
+@Deprecated
 class TestAbstractHttpClientResponseHandler {
 
     @Test
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestBasicResponseHandler.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestBasicResponseHandler.java
index e995b8655..cc48f2416 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestBasicResponseHandler.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestBasicResponseHandler.java
@@ -39,8 +39,11 @@
 
 /**
  * Unit tests for {@link BasicHttpClientResponseHandler}.
+ *
+ * @deprecated Should no longer be used.
  */
 @SuppressWarnings("boxing") // test code
+@Deprecated
 class TestBasicResponseHandler {
 
     @Test