read timeouts do not respect start of request
---------------------------------------------

                 Key: HTTPCORE-149
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-149
             Project: HttpComponents Core
          Issue Type: Bug
          Components: HttpCore
    Affects Versions: 4.0-alpha6
         Environment: 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)
            Reporter: David Koski


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);
                }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to