[ 
https://issues.apache.org/jira/browse/HTTPCORE-422?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15325817#comment-15325817
 ] 

Tom Fitzhenry commented on HTTPCORE-422:
----------------------------------------

Sorry, you're right: not calling #responseReceived would be a bad idea.

The problem is that BasicAsyncResponseConsumer#responseReceived allocates a 4kB 
buffer for the response entity, even if the request is a HEAD request (and 
hence will have no response entity). This is unnecessary allocation. There are 
two things that could be done to avoid this:
(a) BasicAsyncResponseConsumer could allocate in onContentReceived (which 
presumably is not called for HEAD responses, and hence no response entity 
allocation would occur for HEAD responses), OR
(b) Users should not use BasicAsyncResponseConsumer for HEAD requests, and 
instead should use a response consumer that does not allocate a response 
entity. (e.g. the NoopResponseConsumer I listed above).

I'm currently doing (b), which I'm happy to do, but (a) would benefit all users 
of Apache HttpAsyncClient that use BasicAsyncResponseConsumer with HEAD 
requests.

> HttpAsyncRequestExecutor#responseReceived calls 
> HttpAsyncResponseConsumer#responseReceived(HttpResponse), even for HEAD 
> requests
> --------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HTTPCORE-422
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-422
>             Project: HttpComponents HttpCore
>          Issue Type: Improvement
>          Components: HttpCore NIO
>    Affects Versions: 4.4.4
>            Reporter: Tom Fitzhenry
>            Assignee: Oleg Kalnichevski
>            Priority: Minor
>
> HttpAsyncRequestExecutor#responseReceived(NHttpClientConnection) calls 
> HttpAsyncResponseConsumer#responseReceived(HttpResponse) via 
> HttpAsyncClientExchangeHandler#responseReceived(HttpResponse).
> See 
> https://github.com/apache/httpcore/blob/4.4.x/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java#L302
>  .
> It does this even if the request is a HEAD request. If your 
> HttpAsyncResponseConsumer is a BasicAsyncResponseConsumer, then this will 
> allocate a buffer of size content-length kB (or 4kB, if content-length does 
> not exist).
> For a simple proxying Java app, profiling revealed this the allocation due to 
> this was a bottleneck.
> It'd be nice if 
> Are there use cases for calling 
> HttpAsyncResponseConsumer#responseReceived(HttpResponse) on HEAD requests? If 
> not, perhaps it could not be called.
> FWIW, it looks like httpclient doe not call the corresponding method for HEAD 
> requests: 
> https://github.com/apache/httpcore/blob/4.4.x/httpcore/src/main/java/org/apache/http/protocol/HttpRequestExecutor.java#L273-L275



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to