[ 
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]

Reply via email to