hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tom Fitzhenry (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HTTPCORE-422) HttpAsyncRequestExecutor#responseReceived calls HttpAsyncResponseConsumer#responseReceived(HttpResponse), even for HEAD requests
Date Sat, 11 Jun 2016 11:13:20 GMT

    [ 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
(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),
(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:

This message was sent by Atlassian JIRA

To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org

View raw message