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

read timeouts do not respect start of request

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.0-alpha6
    • 4.0-beta2
    • HttpCore
    • None
    • OSX 10.5.2
      java version "1.5.0_13"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-237)
      Java HotSpot(TM) Client VM (build 1.5.0_13-119, mixed mode, sharing)

    Description

      This code in BaseIOReactor

      protected void timeoutCheck(final SelectionKey key, long now) {
      Object attachment = key.attachment();
      if (attachment instanceof SessionHandle) {
      SessionHandle handle = (SessionHandle) key.attachment();
      IOSession session = handle.getSession();
      int timeout = session.getSocketTimeout();
      if (timeout > 0) {
      if (handle.getLastReadTime() + timeout < now) {

      is looking at the last read time. This will be the creation of the connection (if new) or the last time the session was used, if a keepalive connection. If what you connect to has relatively high idle times on its keepalive connections (say 60s) and you submit a request against it after it has been idle for 15 seconds, you lose 15 seconds off your actual timeout.

      For example, in my submitRequest:

      public HttpRequest submitRequest(final HttpContext context) {

      i set the read timeout on a per request basis:

      if (timeout != null)

      { connection.setSocketTimeout((int) timeout.getReadTimeout()); }

      to, e.g. 120 s. My request is for this cgi:

      #!/bin/sh

      echo "content-type: text/plain"
      echo ""

      sleep 110

      ls

      If I use an existing session, this typically times out because it counts from the last read from the request.

      Further evidence, if I have the session and I reset the last read time in submitRequest(), it works correctly:

      try

      { final Field field = session.getClass().getDeclaredField("key"); field.setAccessible(true); final SelectionKey key = (SelectionKey) field.get(session); final SessionHandle handle = (SessionHandle) key.attachment(); handle.resetLastRead(); }

      catch (final Exception e)

      { log.debug("unable to access key", e); }

      Attachments

        Activity

          People

            Unassigned Unassigned
            dkoski David Koski
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: