Why does Apache CloseableHttpResponse not consume the entity on close?
Asked Answered
C

1

6

Looking at the quick start guide it gives the following code example:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST call CloseableHttpResponse#close() from a finally clause.
// Please note that if response content is not fully consumed the underlying
// connection cannot be safely re-used and will be shut down and discarded
// by the connection manager. 
try {
    System.out.println(response1.getStatusLine());
    HttpEntity entity1 = response1.getEntity();
    // do something useful with the response body
    // and ensure it is fully consumed
    EntityUtils.consume(entity1);
} finally {
    response1.close();
}

The two comments in the code above say that we must close the response object for

"correct deallocation of system resources"

and

"if response content is not fully consumed the underlying connection cannot be safely re-used and will be shut down and discarded by the connection manager".

Now Apache have very kindly implementend a CloseableHttpResponse for us, which means we can use a try-with-resources block. But the close method only closes the response object, why doesn't it also consume the entity?

Cran answered 10/6, 2017 at 5:18 Comment(1)
You just asked my exact question with exact words. this is y we have stackoverflow to read multiple developers mind, ThanksCavanagh
I
3

Because it is hard to say at that point whether or not the caller intends to re-use the underlying connection. In some cases one may want to read just a small chunk from a large response body and immediately terminate the connection.

In other words, the same thing happens over and over again: there is no one way that can make everyone happy.

The code snippet will do ensure proper de-allocation of resources while trying to keep the underlying connection alive.

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
try {
    System.out.println(response1.getStatusLine());
} finally {
    EntityUtils.consume(response1.getEntity());
} 
Inserted answered 10/6, 2017 at 11:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.