[
https://issues.apache.org/jira/browse/HTTPCLIENT-2195?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Henry Tung updated HTTPCLIENT-2195:
-----------------------------------
Description:
This moved block seems suspect:
[https://github.com/apache/httpcomponents-client/commit/90d89af98e6cb9e4437d178acf084259607a20c3#diff-81d61e0ba1700fd4dcfb00bf8a8943beec35d825546d1a6b8e35fc5796902656R230]
It always consumes the response and/or disconnects the connection (code
apparently moved from proxy auth challenge retry handling?), but the error
handling block below (code != SC_OK) attempts to read the response, triggering
a very not-informative StreamClosedException. The original, useful error is
lost in the process.
Not entirely clear what the moved block actually does or is intended to do, but
it seems like the response content should be saved for later use by
error-handling or only conditionally-consumed later (when the response is known
to be successful).
Example stacktrace from a proxy tunneling error:
{noformat}
Caused by: org.apache.hc.core5.http.StreamClosedException: Stream already closed
at
org.apache.hc.core5.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:162)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:181)
at java.io.Reader.read(Reader.java:229)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toCharArrayBuffer(EntityUtils.java:178)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:221)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:361)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:341)
at
org.apache.hc.client5.http.impl.classic.ConnectExec.createTunnelToTarget(ConnectExec.java:258)
at
org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:145)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
at
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:175)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
at
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:115)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
at
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:170)
at
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:75)
at
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:89){noformat}
was:
This moved block seems suspect:
[https://github.com/apache/httpcomponents-client/commit/90d89af98e6cb9e4437d178acf084259607a20c3#diff-81d61e0ba1700fd4dcfb00bf8a8943beec35d825546d1a6b8e35fc5796902656R230]
It always consumes the response and/or disconnects the connection (code
apparently moved from proxy auth challenge retry handling?), but the error
handling block below (code != SC_OK) attempts to read the response, triggering
a very not-informative StreamClosedException (and losing the original, useful
error).
Not entirely clear what the moved block actually does or is intended to do, but
it seems like the response content should be saved for later use by
error-handling or only conditionally-consumed later (when the response is known
to be successful).
Example stacktrace from a proxy tunneling error:
{noformat}
Caused by: org.apache.hc.core5.http.StreamClosedException: Stream already closed
at
org.apache.hc.core5.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:162)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:181)
at java.io.Reader.read(Reader.java:229)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toCharArrayBuffer(EntityUtils.java:178)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:221)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:361)
at
org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:341)
at
org.apache.hc.client5.http.impl.classic.ConnectExec.createTunnelToTarget(ConnectExec.java:258)
at
org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:145)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
at
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:175)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
at
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:115)
at
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
at
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:170)
at
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:75)
at
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:89){noformat}
> [regression] Logic error in proxy connection error handling in
> ConnectExec.createTunnelToTarget
> -----------------------------------------------------------------------------------------------
>
> Key: HTTPCLIENT-2195
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2195
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Components: HttpClient (classic)
> Affects Versions: 5.1.2
> Reporter: Henry Tung
> Priority: Major
>
> This moved block seems suspect:
> [https://github.com/apache/httpcomponents-client/commit/90d89af98e6cb9e4437d178acf084259607a20c3#diff-81d61e0ba1700fd4dcfb00bf8a8943beec35d825546d1a6b8e35fc5796902656R230]
> It always consumes the response and/or disconnects the connection (code
> apparently moved from proxy auth challenge retry handling?), but the error
> handling block below (code != SC_OK) attempts to read the response,
> triggering a very not-informative StreamClosedException. The original, useful
> error is lost in the process.
> Not entirely clear what the moved block actually does or is intended to do,
> but it seems like the response content should be saved for later use by
> error-handling or only conditionally-consumed later (when the response is
> known to be successful).
> Example stacktrace from a proxy tunneling error:
> {noformat}
> Caused by: org.apache.hc.core5.http.StreamClosedException: Stream already
> closed
> at
> org.apache.hc.core5.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:162)
> at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
> at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
> at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
> at java.io.InputStreamReader.read(InputStreamReader.java:181)
> at java.io.Reader.read(Reader.java:229)
> at
> org.apache.hc.core5.http.io.entity.EntityUtils.toCharArrayBuffer(EntityUtils.java:178)
> at
> org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:221)
> at
> org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:361)
> at
> org.apache.hc.core5.http.io.entity.EntityUtils.toString(EntityUtils.java:341)
> at
> org.apache.hc.client5.http.impl.classic.ConnectExec.createTunnelToTarget(ConnectExec.java:258)
> at
> org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:145)
> at
> org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
> at
> org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
> at
> org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:175)
> at
> org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
> at
> org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
> at
> org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:115)
> at
> org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
> at
> org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:170)
> at
> org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:75)
> at
> org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:89){noformat}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]