Hi,

I have a problem when using Java HttpClient with a proxy and HTTP/1.1
version. When using a stream body handler, there is no re-use of the TCP
connection.
When using another body handler
(java.net.http.HttpResponse.BodyHandlers#ofString()
or java.net.http.HttpResponse.BodyHandlers#discarding) there is no such
problem.
When using HTTP/2, there is no problem as well.

The following code reproduce the problem. The re-use can be checked
using *netstat
-tn  | grep '3128'  *
class ProxyHttp1Check {
    public static void main(String[] args) throws Exception {
        HttpClient httpClient = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_1_1)
            .proxy(ProxySelector.of(InetSocketAddress.createUnresolved("
my-proxy.net", 3128)))
            .build();
        HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("
https://my-website.test";)).build();
        for (int i = 0; i < 1_000_000_000; i++) {
            httpClient
                .sendAsync(httpRequest,
HttpResponse.BodyHandlers.ofInputStream())
                .get()
                .body()
                .close(); // It seems this is closing the TCP connection
        }
    }
}

The close comes from the client as underlined in the following dump.

T 2021/01/11 19:24:59.880557 client-ip:57422 -> proxy-ip:3128 [S] #265
T 2021/01/11 19:24:59.881067 proxy-ip:3128 -> client-ip:57422 [AS] #266
T 2021/01/11 19:24:59.881098 client-ip:57422 -> proxy-ip:3128 [A] #267
T 2021/01/11 19:24:59.881671 client-ip:57422 -> proxy-ip:3128 [AP] #268
  43 4f 4e 4e 45 43 54 20    61 70 69 2d 74 65 73 74    CONNECT api-test
  2e 61 77 73 2e 62 61 6d    62 6f 72 61 2e 63 6f 6d    .aws.bambora.com
  3a 34 34 33 20 48 54 54    50 2f 31 2e 31 0d 0a 0d    :443 HTTP/1.1...
  0a                                                    .
T 2021/01/11 19:24:59.882077 proxy-ip:3128 -> client-ip:57422 [A] #269
T 2021/01/11 19:24:59.883605 proxy-ip:3128 -> client-ip:57422 [AP] #270
  48 54 54 50 2f 31 2e 31    20 32 30 30 20 43 6f 6e    HTTP/1.1 200 Con
  6e 65 63 74 69 6f 6e 20    65 73 74 61 62 6c 69 73    nection establis
  68 65 64 0d 0a 0d 0a                                  hed....
T 2021/01/11 19:24:59.883627 client-ip:57422 -> proxy-ip:3128 [A] #271
T 2021/01/11 19:24:59.933932 client-ip:57422 -> proxy-ip:3128 [AP] #272
T 2021/01/11 19:24:59.952473 proxy-ip:3128 -> client-ip:57422 [AP] #273
T 2021/01/11 19:24:59.952515 client-ip:57422 -> proxy-ip:3128 [A] #274
*T 2021/01/11 19:25:00.298765 client-ip:57422 -> proxy-ip:3128 [AF] #275*
T 2021/01/11 19:25:00.299777 proxy-ip:3128 -> client-ip:57422 [AF] #276
T 2021/01/11 19:25:00.299809 client-ip:57422 -> proxy-ip:3128 [A] #277

I have tested it on Java 11.0.9.1, 14.0.2 and 15.0.1 on Ubuntu 20.4.1.

 $ /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed
mode, sharing)
 $ java -version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode,
sharing)
 $ java -version
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15.0.1+9, mixed mode, sharing)
$ uname -a
Linux enix-002 5.8.0-36-generic #40~20.04.1-Ubuntu SMP Wed Jan 6 10:15:55
UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Thanks in advance for your help,

Best regards,

Nicolas Henneaux

Reply via email to