Uploaded image for project: 'HttpComponents HttpClient'
  1. HttpComponents HttpClient
  2. HTTPCLIENT-2288

Retry logic in DefaultHttpClientConnectionOperator doesn't handle SocketException

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 4.5.14
    • 4.5.15
    • HttpClient (classic)
    • None

    Description

      DefaultHttpClientConnectionOperator has logic to try to connect to all addresses that a particular host name resolves to: https://github.com/apache/httpcomponents-client/blob/7aca075c6e49c3d2f90dbca081d08ebeb36e2f57/httpclient/src/main/java/org/apache/http/impl/conn/DefaultHttpClientConnectionOperator.java#L153

      However it handles ConnectException and several other exceptions, and recent JDK versions started throwing SocketException in some situations that previous thread ConnectException: https://github.com/openjdk/jdk11u/commit/1d79d3800741d227ac6a588856279e528406c000#diff-b76813f1ff433c5141f02fc9c20c2aae09b255ba9574ff67e49c6e86349235f6L418-R419

      This means that the retries no longer work, leading to failures like the following that could be resolved by retrying:

      Caused by: java.net.SocketException: Network is unreachable (connect failed)
          at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
          at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
          at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
          at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
          at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
          at java.base/java.net.Socket.connect(Socket.java:609)
          at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:368)
          at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
          at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
          at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)

      The latest 5.x versions catch IOException instead of handling more subtypes, so they are not affected by this issue: https://github.com/apache/httpcomponents-client/commit/d5e1392840fcbd9ff9d9c5b19d8ed9da2883c224#diff-c8d113aa21d5fe2678c4c36f731cda6ed01d172d7e47e4d9fc527a5d4a921077R154

      This bug only affects 4.5.x, but would you consider accepting a fix if I sent a PR?

      Attachments

        Activity

          People

            Unassigned Unassigned
            cushon Liam Miller-Cushon
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 20m
                20m