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

org.apache.http.nio.protocol.HttpAsyncService returns an empty response when a socket timeout is detected

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.4.6
    • 4.4.7
    • HttpCore NIO
    • None
    • org.apache.http.nio.protocol.HttpAsyncService does returns an empty response when a socket timeout is detected
    • Important

    Description

      org.apache.http.nio.protocol.HttpAsyncService does returns an empty response when a socket timeout is detected.

      When a timeout occurs in an async proxy when an origin server takes too long to reply, HttpAsyncService returns empty response.

      You can reproduce this issue with our async example NHttpReverseProxy:

      Start it with: http://postman-echo.com 8888

      Then run:

      curl --verbose --max-time 1000 http://localhost:8888/delay/3
      

      and you will get an EMPTY response from the server, no HTTP status code where I would expect a 504 or 500.

      The proxy prints out:

      Reverse proxy to http://postman-echo.com:80
      [client->proxy] connection open 127.0.0.1:8888<->127.0.0.1:61128
      [client->proxy] 00000001 GET /delay/3 HTTP/1.1
      [client->proxy] 00000001 request completed
      [proxy->origin] connection open 192.168.0.112:61130<->52.44.234.173:80
      [proxy->origin] 00000001 GET /delay/3 HTTP/1.1
      [proxy->origin] 00000001 request completed
      [client->proxy] connection closed 127.0.0.1:8888<->127.0.0.1:61128
      [client<-proxy] 00000001 java.net.SocketTimeoutException
      [proxy->origin] connection released 192.168.0.112:61130<->52.44.234.173:80
      [proxy->origin] [total kept alive: 0; total allocated: 0 of 100]
      [proxy->origin] connection closed 192.168.0.112:61130<->52.44.234.173:80
      

      Curl prints:

      * STATE: INIT => CONNECT handle 0x600057930; line 1410 (connection #-5000)
      * Added connection 0. The cache now contains 1 members
      * STATE: CONNECT => WAITRESOLVE handle 0x600057930; line 1446 (connection #0)
      *   Trying ::1...
      * TCP_NODELAY set
      * STATE: WAITRESOLVE => WAITCONNECT handle 0x600057930; line 1527 (connection #0)
      *   Trying 127.0.0.1...
      * TCP_NODELAY set
      * Connected to localhost (127.0.0.1) port 8888 (#0)
      * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x600057930; line 1579 (connection #0)
      * Marked for [keep alive]: HTTP default
      * STATE: SENDPROTOCONNECT => DO handle 0x600057930; line 1597 (connection #0)
      > GET /delay/3 HTTP/1.1
      > Host: localhost:8888
      > User-Agent: curl/7.54.1
      > Accept: */*
      >
      * STATE: DO => DO_DONE handle 0x600057930; line 1676 (connection #0)
      * STATE: DO_DONE => WAITPERFORM handle 0x600057930; line 1801 (connection #0)
      * STATE: WAITPERFORM => PERFORM handle 0x600057930; line 1811 (connection #0)
      * STATE: PERFORM => DONE handle 0x600057930; line 1980 (connection #0)
      * multi_done
      * Empty reply from server
      * Connection #0 to host localhost left intact
      * Expire cleared
      curl: (52) Empty reply from server
      

      I have a fix that returns a 504 GATEWAY_TIMEOUT when a socket timeout is detected.

      Please see branch HTTPCORE-482 in git. Build passes with mvn clean verify. I also attached the changes as a patch in httpcomponents-core-4.4.x.patch.

      I have not created a unit test patch but the above scenario now works.

      Attachments

        1. httpcomponents-core-4.4.x.patch
          1 kB
          Gary D. Gregory

        Activity

          People

            ggregory Gary D. Gregory
            ggregory Gary D. Gregory
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: