[
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 non-informative StreamClosedException. The original, useful error (i.e. the
response + code) is lost in the process.
I'm not clear on what the moved block does, but it seems like the response
content should be saved for later use or only conditionally-consumed later
(when the response is known to be successful). Maybe instead of moving the
block out of proxy-auth-retry, it should be duplicated at the end of the
function instead (after error handling)?
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 non-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). Maybe instead of moving the block out of the
proxy-auth-retry section, it should be duplicated at the end of the function
(below error handling)?
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 non-informative StreamClosedException. The original, useful
> error (i.e. the response + code) is lost in the process.
> I'm not clear on what the moved block does, but it seems like the response
> content should be saved for later use or only conditionally-consumed later
> (when the response is known to be successful). Maybe instead of moving the
> block out of proxy-auth-retry, it should be duplicated at the end of the
> function instead (after error handling)?
> 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]