Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Wed, 4 May 2016 14:58:25 +0000 (16:58 +0200)
committerKim Alvefur <zash@zash.se>
Wed, 4 May 2016 14:58:25 +0000 (16:58 +0200)
1  2 
net/server_event.lua

diff --combined net/server_event.lua
index 08524646c19e4ebf2aa63e89f1e4d6e92ae1a648,2cb45553b9fdd552413602e66aea1a77ebf49b77..c10173e48cea11f9678ef9276f9c518fda64ba0c
@@@ -30,6 -30,7 +30,7 @@@ local cfg = 
        WRITE_TIMEOUT         = 180,  -- timeout in seconds for write data on socket
        CONNECT_TIMEOUT       = 20,  -- timeout in seconds for connection attempts
        CLEAR_DELAY           = 5,  -- seconds to wait for clearing interface list (and calling ondisconnect listeners)
+       READ_RETRY_DELAY      = 1e-06, -- if, after reading, there is still data in buffer, wait this long and continue reading
        DEBUG                 = true,  -- show debug messages
  }
  
@@@ -559,7 -560,7 +560,7 @@@ local function handleclient( client, ip
                        interface.eventread = nil
                        return -1
                end
-               if EV_TIMEOUT == event and interface:onreadtimeout() ~= true then
+               if EV_TIMEOUT == event and not interface.conn:dirty() and interface:onreadtimeout() ~= true then
                        return -1 -- took too long to get some data from client -> disconnect
                end
                if interface._usingssl then  -- handle luasec
                                        interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT )
                                end
                                interface.eventreadtimeout = addevent( base, nil, EV_TIMEOUT,
-                               function( )
-                                       interface:_close()
-                               end, cfg.READ_TIMEOUT
-                               )
+                                       function( ) interface:_close() end, cfg.READ_TIMEOUT)
                                debug( "wantwrite during read attempt, reg it in writecallback but dont know what really happens next..." )
                                -- to be honest i dont know what happens next, if it is allowed to first read, the write etc...
                        else  -- connection was closed or fatal error
                        interface.eventread = nil;
                        return -1;
                end
+               if interface.conn:dirty() then -- still data left in buffer
+                       return EV_TIMEOUT, cfg.READ_RETRY_DELAY;
+               end
                return EV_READ, cfg.READ_TIMEOUT
        end
  
@@@ -805,20 -806,6 +806,20 @@@ local function link(sender, receiver, b
        sender:set_mode("*a");
  end
  
 +local function add_task(delay, callback)
 +      local event_handle;
 +      event_handle = base:addevent(nil, 0, function ()
 +              local ret = callback(socket_gettime());
 +              if ret then
 +                      return 0, ret;
 +              elseif event_handle then
 +                      return -1;
 +              end
 +      end
 +      , delay);
 +      return event_handle;
 +end
 +
  return {
        cfg = cfg,
        base = base,
        closeall = closeallservers,
        get_backend = get_backend,
        hook_signal = hook_signal,
 +      add_task = add_task,
  
        __NAME = SCRIPT_NAME,
        __DATE = LAST_MODIFIED,