Uploaded image for project: 'HttpComponents HttpCore'
  1. HttpComponents HttpCore
  2. HTTPCORE-705

HTTP/1.0 connection persistence is broken

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 5.1.2
    • 5.1.3, 5.2-beta1
    • None
    • None

    Description

      If I download a file repeatedly using a single instance of CloseableHttpAsyncClient, the following exception is thrown after few requests

      java.io.IOException: org.apache.hc.core5.http.ConnectionClosedException: Connection is closed

      The following test app always ends up with a ConnectionClosedException after a number of requests

      public class TestHTTP
      {
          public static void main(final String[] args) throws Exception
          {
              URI uri = new URI("http://127.0.0.1:8000/crls/test-ca-no-next-update.crl");
      
              CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
      
              client.start();
      
              try {
                  SimpleHttpRequest request = SimpleRequestBuilder.get(uri).build();
      
                  SimpleRequestProducer requestProducer = SimpleRequestProducer.create(request);
                  SimpleResponseConsumer responseConsumer = SimpleResponseConsumer.create();
      
                  FutureCallback<SimpleHttpResponse> callback = new FutureCallback<SimpleHttpResponse>()
                  {
                      @Override
                      public void completed(final SimpleHttpResponse response) {
                          System.out.println("************** completed");
                          System.out.println(request + "->" + new StatusLine(response));
                          System.out.println(response.getBody());
                      }
      
                      @Override
                      public void failed(final Exception ex) {
                          System.out.println("************** failed");
                          System.out.println(request + "->" + ex);
                      }
      
                      @Override
                      public void cancelled() {
                          System.out.println("************** canceled");
                          System.out.println(request + " cancelled");
                      }
                  };
      
                  for (int i = 0; i < 10000; i++)
                  {
                      System.out.println("Request: " + i);
      
                      Future<SimpleHttpResponse> future = client.execute(
                              requestProducer,
                              responseConsumer,
                              callback);
      
                      future.get();
      
                      //if sleep is enabled, no exception will be thrown
                      //Thread.sleep(1);
                  }
              }
              catch (ExecutionException e) {
                  e.printStackTrace();
              }
              finally {
                  client.close(CloseMode.GRACEFUL);
              }
          }
      }
      

       

      The full stack trace:

      java.util.concurrent.ExecutionException: org.apache.hc.core5.http.ConnectionClosedException: Connection is closed
          at org.apache.hc.core5.concurrent.BasicFuture.getResult(BasicFuture.java:72)
          at org.apache.hc.core5.concurrent.BasicFuture.get(BasicFuture.java:85)
          at test.TestHTTP.main(TestHTTP.java:65)
      Caused by: org.apache.hc.core5.http.ConnectionClosedException: Connection is closed
          at org.apache.hc.core5.http.nio.command.CommandSupport.cancelCommands(CommandSupport.java:76)
          at org.apache.hc.core5.http.impl.nio.AbstractHttp1StreamDuplexer.onDisconnect(AbstractHttp1StreamDuplexer.java:409)
          at org.apache.hc.core5.http.impl.nio.AbstractHttp1IOEventHandler.disconnected(AbstractHttp1IOEventHandler.java:95)
          at org.apache.hc.core5.http.impl.nio.ClientHttp1IOEventHandler.disconnected(ClientHttp1IOEventHandler.java:39)
          at org.apache.hc.core5.reactor.InternalDataChannel.disconnected(InternalDataChannel.java:193)
          at org.apache.hc.core5.reactor.SingleCoreIOReactor.processClosedSessions(SingleCoreIOReactor.java:231)
          at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:133)
          at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
          at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
          at java.base/java.lang.Thread.run(Thread.java:829)
       

      The file that is downloaded is served by python http server running on localhost:

      python3 -m http.server

      If I add Thread.sleep, the exception will not happen.

      For some reason it looks like the IOReactorWorker background thread closes the CloseableHttpAsyncClient

      Any idea? 

      Attachments

        1. TestHTTPClient.zip
          3.46 MB
          Martijn Brinkers
        2. full-wire-log.txt
          237 kB
          Martijn Brinkers

        Activity

          People

            Unassigned Unassigned
            martijn_brinkers Martijn Brinkers
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: