[ 
https://issues.apache.org/jira/browse/HTTPCLIENT-2344?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17884788#comment-17884788
 ] 

Ben Plotnick edited comment on HTTPCLIENT-2344 at 9/25/24 9:18 PM:
-------------------------------------------------------------------

Here's a repro: [https://github.com/bplotnick/httpclient-envoy/tree/main]

And the logs:
{code:java}
13:23:47.361 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ex-0000000001 
preparing request execution
13:23:47.367 [main] DEBUG org.apache.hc.client5.http.impl.classic.ProtocolExec 
- ex-0000000001 target auth state: UNCHALLENGED
13:23:47.367 [main] DEBUG org.apache.hc.client5.http.impl.classic.ProtocolExec 
- ex-0000000001 proxy auth state: UNCHALLENGED
13:23:47.368 [main] DEBUG org.apache.hc.client5.http.impl.classic.ConnectExec - 
ex-0000000001 acquiring connection with route {}->http://localhost:10000
13:23:47.371 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ex-0000000001 
acquiring endpoint (3 MINUTES)
13:23:47.372 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ex-0000000001 endpoint lease request (3 MINUTES) [route: 
{}->http://localhost:10000][total available: 0; route allocated: 0 of 5; total 
allocated: 0 of 25]
13:23:47.373 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ex-0000000001 endpoint leased [route: {}->http://localhost:10000][total 
available: 0; route allocated: 1 of 5; total allocated: 1 of 25]
13:23:47.378 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ex-0000000001 acquired ep-0000000001
13:23:47.378 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ex-0000000001 
acquired endpoint ep-0000000001
13:23:47.378 [main] DEBUG org.apache.hc.client5.http.impl.classic.ConnectExec - 
ex-0000000001 opening connection {}->http://localhost:10000
13:23:47.379 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
connecting endpoint (null)
13:23:47.379 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connecting endpoint to http://localhost:10000 (3 MINUTES)
13:23:47.380 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
localhost resolving remote address
13:23:47.381 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
localhost resolved to [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
13:23:47.381 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
http://localhost:10000 connecting null->localhost/127.0.0.1:10000 (3 MINUTES)
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
http-outgoing-0 http://localhost:10000 connected 
/127.0.0.1:60743->localhost/127.0.0.1:10000
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultManagedHttpClientConnection - 
http-outgoing-0 set socket timeout to 3 MINUTES
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connected http-outgoing-0
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
endpoint connected
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.MainClientExec - ex-0000000001 
executing GET / HTTP/1.1
13:23:47.393 [main] DEBUG org.apache.hc.client5.http.protocol.RequestUpgrade - 
Connection is upgradable: protocol version = HTTP/1.1
13:23:47.393 [main] DEBUG org.apache.hc.client5.http.protocol.RequestUpgrade - 
Connection is upgradable to TLS: method = GET
13:23:47.393 [main] DEBUG org.apache.hc.client5.http.protocol.RequestAddCookies 
- ex-0000000001 Cookie spec selected: strict
13:23:47.396 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
start execution ex-0000000001
13:23:47.396 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 executing exchange ex-0000000001 over http-outgoing-0
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> GET / HTTP/1.1
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Accept-Encoding: gzip, x-gzip, deflate
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Host: localhost:10000
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Connection: keep-alive
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> User-Agent: Apache-HttpClient/5.4 (Java/21.0.3)
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Upgrade: TLS/1.2
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Connection: Upgrade
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"GET / HTTP/1.1[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Accept-Encoding: gzip, x-gzip, deflate[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Host: localhost:10000[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Connection: keep-alive[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"User-Agent: Apache-HttpClient/5.4 (Java/21.0.3)[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Upgrade: TLS/1.2[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Connection: Upgrade[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"HTTP/1.1 403 Forbidden[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"date: Wed, 25 Sep 2024 17:23:47 GMT[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"server: envoy[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"connection: close[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"content-length: 0[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"[\r][\n]"
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< HTTP/1.1 403 Forbidden
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< date: Wed, 25 Sep 2024 17:23:47 GMT
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< server: envoy
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< connection: close
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< content-length: 0
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultManagedHttpClientConnection - 
http-outgoing-0 close connection IMMEDIATE
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
endpoint closed
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
discarding endpoint
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 releasing endpoint
13:23:47.416 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connection is not kept alive)
13:23:47.416 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connection released [route: {}->http://localhost:10000][total 
available: 0; route allocated: 0 of 5; total allocated: 0 of 25]
Response code: 403
Response body:
13:23:47.417 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
Shutdown connection pool GRACEFUL
13:23:47.417 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
Connection pool shut down{code}
I tried a number of other proxies and they did not have this issue.

That being said, I still stand by my previous statement that adding this as a 
default is not the right thing to do since Envoy/Istio is widely used in a 
sidecar configuration with this exact scenario on millions of machines. This 
does break real deployed applications and it's worth considering whether that 
is the best thing to do for the users.


was (Author: JIRAUSER307140):
Here's a repro: [https://github.com/bplotnick/httpclient-envoy/tree/main]

And the logs:

```

13:23:47.361 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ex-0000000001 
preparing request execution
13:23:47.367 [main] DEBUG org.apache.hc.client5.http.impl.classic.ProtocolExec 
- ex-0000000001 target auth state: UNCHALLENGED
13:23:47.367 [main] DEBUG org.apache.hc.client5.http.impl.classic.ProtocolExec 
- ex-0000000001 proxy auth state: UNCHALLENGED
13:23:47.368 [main] DEBUG org.apache.hc.client5.http.impl.classic.ConnectExec - 
ex-0000000001 acquiring connection with route {}->[http://localhost:10000]
13:23:47.371 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ex-0000000001 
acquiring endpoint (3 MINUTES)
13:23:47.372 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ex-0000000001 endpoint lease request (3 MINUTES) [route: 
{}->[http://localhost:10000]][total available: 0; route allocated: 0 of 5; 
total allocated: 0 of 25]
13:23:47.373 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ex-0000000001 endpoint leased [route: {}->[http://localhost:10000]][total 
available: 0; route allocated: 1 of 5; total allocated: 1 of 25]
13:23:47.378 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ex-0000000001 acquired ep-0000000001
13:23:47.378 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ex-0000000001 
acquired endpoint ep-0000000001
13:23:47.378 [main] DEBUG org.apache.hc.client5.http.impl.classic.ConnectExec - 
ex-0000000001 opening connection {}->[http://localhost:10000]
13:23:47.379 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
connecting endpoint (null)
13:23:47.379 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connecting endpoint to http://localhost:10000 (3 MINUTES)
13:23:47.380 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
localhost resolving remote address
13:23:47.381 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
localhost resolved to [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
13:23:47.381 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
http://localhost:10000 connecting null->localhost/127.0.0.1:10000 (3 MINUTES)
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator - 
http-outgoing-0 http://localhost:10000 connected 
/127.0.0.1:60743->localhost/127.0.0.1:10000
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultManagedHttpClientConnection - 
http-outgoing-0 set socket timeout to 3 MINUTES
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connected http-outgoing-0
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
endpoint connected
13:23:47.393 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.MainClientExec - ex-0000000001 
executing GET / HTTP/1.1
13:23:47.393 [main] DEBUG org.apache.hc.client5.http.protocol.RequestUpgrade - 
Connection is upgradable: protocol version = HTTP/1.1
13:23:47.393 [main] DEBUG org.apache.hc.client5.http.protocol.RequestUpgrade - 
Connection is upgradable to TLS: method = GET
13:23:47.393 [main] DEBUG org.apache.hc.client5.http.protocol.RequestAddCookies 
- ex-0000000001 Cookie spec selected: strict
13:23:47.396 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
start execution ex-0000000001
13:23:47.396 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 executing exchange ex-0000000001 over http-outgoing-0
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> GET / HTTP/1.1
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Accept-Encoding: gzip, x-gzip, deflate
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Host: localhost:10000
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Connection: keep-alive
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> User-Agent: Apache-HttpClient/5.4 (Java/21.0.3)
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Upgrade: TLS/1.2
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
>> Connection: Upgrade
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"GET / HTTP/1.1[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Accept-Encoding: gzip, x-gzip, deflate[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Host: localhost:10000[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Connection: keep-alive[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"User-Agent: Apache-HttpClient/5.4 (Java/21.0.3)[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Upgrade: TLS/1.2[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"Connection: Upgrade[\r][\n]"
13:23:47.397 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 >> 
"[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"HTTP/1.1 403 Forbidden[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"date: Wed, 25 Sep 2024 17:23:47 GMT[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"server: envoy[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"connection: close[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"content-length: 0[\r][\n]"
13:23:47.411 [main] DEBUG org.apache.hc.client5.http.wire - http-outgoing-0 << 
"[\r][\n]"
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< HTTP/1.1 403 Forbidden
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< date: Wed, 25 Sep 2024 17:23:47 GMT
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< server: envoy
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< connection: close
13:23:47.412 [main] DEBUG org.apache.hc.client5.http.headers - http-outgoing-0 
<< content-length: 0
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.io.DefaultManagedHttpClientConnection - 
http-outgoing-0 close connection IMMEDIATE
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
endpoint closed
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.classic.InternalHttpClient - ep-0000000001 
discarding endpoint
13:23:47.415 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 releasing endpoint
13:23:47.416 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connection is not kept alive)
13:23:47.416 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
ep-0000000001 connection released [route: {}->[http://localhost:10000]][total 
available: 0; route allocated: 0 of 5; total allocated: 0 of 25]
Response code: 403
Response body:
13:23:47.417 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
Shutdown connection pool GRACEFUL
13:23:47.417 [main] DEBUG 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager - 
Connection pool shut down

```

I tried a number of other proxies and they did not have this issue.

That being said, I still stand by my previous statement that adding this as a 
default is not the right thing to do since Envoy/Istio is widely used in a 
sidecar configuration with this exact scenario on millions of machines. This 
does break real deployed applications and it's worth considering whether that 
is the best thing to do for the users.

> HTTP/1.1 TLS Upgrade (RFC-2817) should not be default
> -----------------------------------------------------
>
>                 Key: HTTPCLIENT-2344
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2344
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpClient (classic)
>    Affects Versions: 5.4
>            Reporter: Ben Plotnick
>            Priority: Minor
>             Fix For: 5.4.1
>
>
> Version 5.4 added RFC-2817 support, which by default tries to upgradeĀ  since 
> protocolUpgradeEnabled is default enabled.
> Although the strict reading of the spec would indicate that a server should 
> ignore upgrade requests that it cannot service, conservative proxies might 
> reject these requests entirely. This is the case in Envoy today
> I don't see a big advantage to enabling this by default and it is causing 
> real issues now.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to