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 faa221f0a..edbac8a43 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 @@ -72,7 +72,7 @@ public Content handleEntity(final HttpEntity entity) throws IOException { public Content handleResponse(final ClassicHttpResponse response) throws IOException { final int statusCode = response.getCode(); final HttpEntity entity = response.getEntity(); - final byte[] contentBytes = (entity != null) ? EntityUtils.toByteArray(entity, MAX_MESSAGE_LENGTH) : new byte[0]; + final byte[] contentBytes = (entity != null) ? ((statusCode >= 300) ? EntityUtils.toByteArray(entity, MAX_MESSAGE_LENGTH) : EntityUtils.toByteArray(entity)) : new byte[0]; final ContentType contentType = (entity != null && entity.getContentType() != null) ? ContentType.parse(entity.getContentType()) : ContentType.DEFAULT_BINARY; final Content content = new Content(contentBytes, contentType); if (statusCode >= 300) { 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 35e3ae464..cb3378f41 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 @@ -31,12 +31,14 @@ import java.nio.charset.StandardCharsets; import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.HttpResponseException; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import org.apache.hc.client5.testing.sync.extension.TestClientResources; import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpStatus; import org.apache.hc.core5.http.URIScheme; import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.http.io.entity.StringEntity; @@ -79,6 +81,20 @@ public void setUp() throws Exception { } response.setEntity(responseEntity); }); + + // Handler for large content large message + server.registerHandler("/large-message", (request, response, context) -> { + final String largeContent = generateLargeString(10000); // Large content string + response.setEntity(new StringEntity(largeContent, ContentType.TEXT_PLAIN)); + }); + + // Handler for large content large message with error + server.registerHandler("/large-message-error", (request, response, context) -> { + final String largeContent = generateLargeString(10000); // Large content string + response.setCode(HttpStatus.SC_REDIRECTION); + response.setEntity(new StringEntity(largeContent, ContentType.TEXT_PLAIN)); + }); + } @Test @@ -156,4 +172,38 @@ public void testConnectionRelease() throws Exception { } } + private String generateLargeString(final int size) { + final StringBuilder sb = new StringBuilder(size); + for (int i = 0; i < size; i++) { + sb.append("x"); + } + return sb.toString(); + } + + @Test + public void testLargeResponse() throws Exception { + + final HttpHost target = targetHost(); + final String baseURL = "http://localhost:" + target.getPort(); + + final Content content = Request.get(baseURL + "/large-message").execute().returnContent(); + Assertions.assertEquals(10000, content.asBytes().length); + } + + @Test + public void testLargeResponseError() throws Exception { + final HttpHost target = targetHost(); + final String baseURL = "http://localhost:" + target.getPort(); + + try { + Request.get(baseURL + "/large-message-error").execute().returnContent(); + Assertions.fail("Expected an HttpResponseException to be thrown"); + } catch (final HttpResponseException e) { + // Check if the content of the exception is less than or equal to 256 bytes + final byte[] contentBytes = e.getContentBytes(); + Assertions.assertNotNull(contentBytes, "Content bytes should not be null"); + Assertions.assertTrue(contentBytes.length <= 256, "Content length should be less or equal to 256 bytes"); + } + } + }