[ 
https://issues.apache.org/jira/browse/GERONIMO-3824?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12566575#action_12566575
 ] 

Rick McGuire commented on GERONIMO-3824:
----------------------------------------

Committed revision 619394.  Mina 1.1.5 sandbox version. 
Committed revision 619395.  Mina 2.0 sandbox version. 


> ProtocolDecoderException is thrown if the response does not specify 
> Content-Length but is not chunked
> -----------------------------------------------------------------------------------------------------
>
>                 Key: GERONIMO-3824
>                 URL: https://issues.apache.org/jira/browse/GERONIMO-3824
>             Project: Geronimo
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>          Components: AsyncHttpClient
>    Affects Versions: 1.x
>            Reporter: Sangjin Lee
>         Attachments: GERONIMO-3824.patch
>
>
> I've been testing AHC against different servers, and found an interesting 
> case.
> I configured AHC not to reuse connections (which makes AHC insert 
> "Connection: close" in its requests).  Then I pointed to a main index.jsp 
> page for a Tomcat 5.5.25 installation.  What I noticed then is the server 
> does not chunk the content nor sends the Content-Length header.  It simply 
> closes the connection to terminate.
> This is not a good thing to do, but it is not exactly illegal either, it 
> appears according to the spec.  In this case, however, the protocol codec 
> gets confused, and throws a StringIndexOutOfBoundsException.
> HttpResponseDecoder makes an explicit assumption that you either chunk the 
> response or specify the Content-Length header.  Please see 
> HttpResponseCoder.processContent(), and notice the lack of the else clause.  
> As a result, HttpResponseCoder transitions to the STATE_CONTENT_READ state, 
> and thinks it is done with the response (although the content is null).  But 
> HttpResponseDecoder gets invoked again right away, and that second entry into 
> doDecode() is what throws the exception.  Please see the following call stack.
> I think at least we should be able to handle a case where the server 
> terminates a response without specifying the Content-Length header...
> org.apache.mina.filter.codec.ProtocolDecoderException: 
> java.lang.StringIndexOutOfBoundsException (Hexdump: <omitted>)
>       at 
> org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:164)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
>       at 
> org.apache.mina.filter.support.SSLHandler.flushScheduledEvents(SSLHandler.java:275)
>       at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:427)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.messageReceived(AbstractIoFilterChain.java:499)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
>       at 
> org.apache.mina.common.support.AbstractIoFilterChain.fireMessageReceived(AbstractIoFilterChain.java:293)
>       at 
> org.apache.mina.transport.socket.nio.SocketIoProcessor.read(SocketIoProcessor.java:228)
>       at 
> org.apache.mina.transport.socket.nio.SocketIoProcessor.process(SocketIoProcessor.java:198)
>       at 
> org.apache.mina.transport.socket.nio.SocketIoProcessor.access$400(SocketIoProcessor.java:45)
>       at 
> org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:485)
>       at 
> org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
>       at java.lang.Thread.run(Thread.java:803)
> Caused by: java.lang.StringIndexOutOfBoundsException
>       at java.lang.String.substring(String.java:1088)
>       at org.apache.ahc.codec.HttpDecoder.decodeStatus(HttpDecoder.java:145)
>       at 
> org.apache.ahc.codec.HttpResponseDecoder.processStatus(HttpResponseDecoder.java:276)
>       at 
> org.apache.ahc.codec.HttpResponseDecoder.doDecode(HttpResponseDecoder.java:61)
>       at 
> org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:133)
>       at 
> org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:157)
>       ... 19 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to