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

BasicHttpClientConnectionManager always close the socket connection

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Invalid
    • 5.1
    • None
    • HttpClient (classic)
    • None

    Description

      Test Case:

      Created ClosableHttpClient with BasicHttpClientConnectionManager.

      Used the ClosableHttpClient object to do two post and all successful. 

      The problem is keepAlive does not work and two posts create two socket connections.

      The second post does not reuse the socket created by first post .

       

      Fist post 
      2021-08-03 09:48:28,291 DEBUG [org.apache.hc.client5.http.impl.classic.InternalHttpClient] ex-00000001: preparing request execution

      .....

      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager] Connection can be kept alive for 50 SECONDS
      response code: 200

      Second post
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.InternalHttpClient] ex-00000002: preparing request execution
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.InternalHttpClient] ex-00000002: preparing request execution
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.protocol.RequestAddCookies] Cookie spec selected: strict
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.protocol.RequestAddCookies] Cookie spec selected: strict
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.protocol.RequestAuthCache] Auth cache not set in the context
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.protocol.RequestAuthCache] Auth cache not set in the context
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-00000002: target auth state: UNC
      HALLENGED
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-00000002: proxy auth state: UNCH
      ALLENGED
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.ConnectExec] ex-00000002: acquiring connection wi
      th route {s}->https://ecpr-et.wellsfargo.com:4444
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.InternalHttpClient] ex-00000002: acquiring endpoi
      nt (50 SECONDS)
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager] Get connection for r
      oute {s}->https://ecpr-et.wellsfargo.com:4444
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager] Closing connection G
      RACEFUL
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.io.DefaultManagedHttpClientConnection] http-outgoing-0: c
      lose connection GRACEFUL
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.InternalHttpClient] ex-00000002: acquired endpoin
      t InternalConnectionEndpoint-58aa1698
      2021-08-03 09:48:28,868 DEBUG [org.apache.hc.client5.http.impl.classic.ConnectExec] ex-00000002: opening connection {s}-
      >https://ecpr-et.wellsfargo.com:4444

      ................

      Note: Above trace showed that second post will close previous socket when "Get connection for route {s}->https://ecpr-et.wellsfargo.com:4444"

      Did debug and saw the issue at follow method. of BasicHttpClientConnectionManager class

      synchronized ManagedHttpClientConnection getConnection(final HttpRoute route, final Object state) throws IOException {
      ..................
      Asserts.check(!this.leased, "Connection is still allocated");
      if (!LangUtils.equals(this.route, route) || !LangUtils.equals(this.state, state))

      { closeConnection(CloseMode.GRACEFUL); }

      ..................
      return this.conn;
      }

      Bug is at line: "if (!LangUtils.equals(this.route, route) || !LangUtils.equals(this.state, state)) {"

      For stateless HTTP call, the state is always null, LangUtils.equal() always returns false.

      That line is always true even first post and second post has same route.  Therefore, it always call "closeConnection(CloseMode.GRACEFUL);" to close the previous socket connection although it meets keepAlive requirement. 

       

       

       

       

      Attachments

        Activity

          People

            Unassigned Unassigned
            neng1998 neng xu
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: