[
https://issues.apache.org/jira/browse/HTTPCORE-367?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13850922#comment-13850922
]
Oleg Kalnichevski commented on HTTPCORE-367:
--------------------------------------------
Hi Girish,
The original change was mainly driven by HTTPASYNC-40 and was meant largely as
performance optimization of some fairly rare cases. Unfortunately it was not
fully thought out. I do not have a better solution at the moment that can be
done without breaking the existing APIs. I think HttpCore NIO reached the
point where significant improvements cannot be done without sacrificing
backward compatibility. For instance in this particular case I wish I made
#inputReady return the number of bytes read by the operation.
Oleg
> DefaultNHttpClientConnection enters infinite loop when consuming chunked
> response
> ---------------------------------------------------------------------------------
>
> Key: HTTPCORE-367
> URL: https://issues.apache.org/jira/browse/HTTPCORE-367
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: HttpCore NIO
> Affects Versions: 4.3
> Environment: Java 1.7.0_40
> Reporter: Paul McLellan
> Fix For: 4.3.1
>
>
> We recently upgraded from 4.3-beta2 to 4.3 and noticed that our client was
> not fully consuming large (~64K) responses from the server. A little digging
> led us to the 'consumeInput(NHttpClientEventHandler)' method of
> DefaultNHttpClientConnection. Within this method, the following logic from
> 4.3-beta2:
> if (this.contentDecoder != null && (this.session.getEventMask() &
> SelectionKey.OP_READ) > 0) {
> handler.inputReady(this, this.contentDecoder);
> if (this.contentDecoder.isCompleted()) {
> // Response entity received
> // Ready to receive a new response
> resetInput();
> }
> }
> Has been replaced with:
> if (this.contentDecoder != null) {
> // Loop until there is interest in input,
> // decoder is not done and there is buffered session data
> while ((this.session.getEventMask() & SelectionKey.OP_READ) > 0) {
> handler.inputReady(this, this.contentDecoder);
> if (this.contentDecoder.isCompleted()) {
> // Response entity received
> // Ready to receive a new response
> resetInput();
> break;
> }
> if (!this.inbuf.hasData()) {
> break;
> }
> }
> }
> This is causing the dispatcher thread to become stuck in an infinite loop
> when it reaches the end of the first chunk because the input buffer contains
> a single character ('\r') that is never consumed by the ChunkDecoder. Prior
> to the upgrade this method would exit and the dispatcher thread would be able
> to read the next chunk from the inbound channel.
> Can you help with this issue please? Any assistance/guidance would be greatly
> appreciated.
> Thanks.
--
This message was sent by Atlassian JIRA
(v6.1.4#6159)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]