Hi Nicolas,

If I understand correctly you are closing the input stream without
draining the bytes. With HTTP/1.1 this will force the connection
to get closed. This is the expected behavior.

best regards,

-- daniel

On 11/01/2021 20:29, Nicolas Henneaux wrote:
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 <http://my-proxy.net>", 3128)))
             .build();
        HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("https://my-website.test <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 <http://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