[
https://issues.apache.org/jira/browse/HTTPCORE-614?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16981201#comment-16981201
]
jan commented on HTTPCORE-614:
------------------------------
Closing the ClosableHttpResponse first, the SocketInputStream returns -1, that
is great, but still, there is no zero-length closing chunk searched by the
ChunkedInputStream. The reproducer can be similar to the first case:
{code:java}
HttpTransportMetricsImpl metrics = new HttpTransportMetricsImpl();
SessionInputBufferImpl sessionInputBuffer = new SessionInputBufferImpl(metrics,
8192);
String content = "1\r\nA";
ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
sessionInputBuffer.bind(bais);
ChunkedInputStream cis = new ChunkedInputStream(sessionInputBuffer, null);
Assert.assertEquals('A', cis.read());
cis.close();{code}
_org.apache.http.MalformedChunkCodingException: CRLF expected at end of chunk_
is thrown.
> ChunkedInputStream makes connection unclosable?
> -----------------------------------------------
>
> Key: HTTPCORE-614
> URL: https://issues.apache.org/jira/browse/HTTPCORE-614
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: HttpCore
> Reporter: jan
> Priority: Major
>
> Suppose the following code:
>
> {code:java}
> CloseableHttpResponse response =...
> InputStream i = response.getEntity().getContent();
> {code}
> With Apache httpclient 4.5, it was possible to do
>
> {code:java}
> response.close();
> i.close();
> {code}
>
> With Apache 4.5.1+ it is no longer possible. For instance, with 4.5.9, it
> throws:
>
> {noformat}
> Caused by: org.apache.http.MalformedChunkCodingException: CRLF expected at
> end of chunkCaused by:
> org.apache.http.MalformedChunkCodingException: CRLF expected at end of chunk
> at
> org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:250)
>
> at
> org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:222)
>
> at
> org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:183)
> at
> org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:210)
> at
> org.apache.http.impl.io.ChunkedInputStream.close(ChunkedInputStream.java:312)
> at
> org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:142)
>
> at
> org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
>
> at
> org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:172)
>
> at java.io.BufferedInputStream.close(BufferedInputStream.java:483)
> at java.io.FilterInputStream.close(FilterInputStream.java:181){noformat}
>
> The underlying connection is closed and ChunkedInputStream is unhappy.
> The advised solution was to switch the close order to:
>
> {code:java}
> i.close()
> response.close().
> {code}
>
> But in this case, when i.close() is called, the thread is stuck on reading
> from the connection since the ChunkedInputStream tries to read from the
> socket:
> {noformat}
> java.lang.Thread.State: RUNNABLE
> at java.net.SocketInputStream.socketRead0(Native Method)
> at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
> at java.net.SocketInputStream.read(SocketInputStream.java:171)
> at java.net.SocketInputStream.read(SocketInputStream.java:141)
> at
> org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
> at
> org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
> at
> org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
> at
> org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:261)
> at
> org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:222)
> at
> org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:183)
> at
> org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:210)
> at
> org.apache.http.impl.io.ChunkedInputStream.close(ChunkedInputStream.java:312)
> at
> org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:142)
> at
> org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
> at
> org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:172)
> at java.io.BufferedInputStream.close(BufferedInputStream.java:483)
> at java.io.FilterInputStream.close(FilterInputStream.java:181)
> {noformat}
> What would be the correct solution to close the connection?
> The brief history of the issue is at
> https://github.com/eclipse-ee4j/jersey/issues/4321.
>
>
>
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]