Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Tue, 5 Apr 2016 18:54:43 +0000 (20:54 +0200)
committerKim Alvefur <zash@zash.se>
Tue, 5 Apr 2016 18:54:43 +0000 (20:54 +0200)
1  2 
net/server_event.lua

diff --combined net/server_event.lua
index 7940a1b831e1c4c11c0dcd6a9dc66af5e5db2260,0c3c4b040fb010063b7987bd18d8df3c70b5d799..9e1ef50dba810988395ec07dacc4948c220dd570
@@@ -97,7 -97,7 +97,7 @@@ function interface_mt:_close(
        return self:_destroy();
  end
  
 -function interface_mt:_start_connection(plainssl) -- should be called from addclient
 +function interface_mt:_start_connection(plainssl) -- called from wrapclient
        local callback = function( event )
                if EV_TIMEOUT == event then  -- timeout during connection
                        self.fatalerror = "connection timeout"
@@@ -257,9 -257,9 +257,9 @@@ en
  
  function interface_mt:resume()
        self:_lock(self.nointerface, false, self.nowriting);
-               if self.readcallback and not self.eventread then
+       if self.readcallback and not self.eventread then
                self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT );  -- register callback
-                       return true;
+               return true;
        end
  end
  
@@@ -391,7 -391,8 +391,8 @@@ function interface_mt:starttls(sslctx, 
        if not self.eventwrite then
                self:_lock( true, true, true )  -- lock the interface, to not disturb the handshake
                self.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, self.startsslcallback, 0 )  -- add event to start handshake
-       else  -- wait until writebuffer is empty
+       else
+               -- wait until writebuffer is empty
                self:_lock( true, true, false )
                debug "ssl session delayed until writebuffer is empty..."
        end
@@@ -408,10 -409,13 +409,13 @@@ en
  
  function interface_mt:setlistener(listener)
        self:ondetach(); -- Notify listener that it is no longer responsible for this connection
-       self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout,
-       self.onreadtimeout, self.onstatus, self.ondetach
-               = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout,
-                 listener.onreadtimeout, listener.onstatus, listener.ondetach;
+       self.onconnect = listener.onconnect;
+       self.ondisconnect = listener.ondisconnect;
+       self.onincoming = listener.onincoming;
+       self.ontimeout = listener.ontimeout;
+       self.onreadtimeout = listener.onreadtimeout;
+       self.onstatus = listener.onstatus;
+       self.ondetach = listener.ondetach;
  end
  
  -- Stub handlers
@@@ -581,9 -585,9 +585,9 @@@ local function handleclient( client, ip
                                        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...
@@@ -703,14 -707,16 +707,16 @@@ local function addclient( addr, serverp
                debug "need luasec, but not available"
                return nil, "luasec not found"
        end
-       if getaddrinfo and not typ then
+       if not typ then
                local addrinfo, err = getaddrinfo(addr)
                if not addrinfo then return nil, err end
                if addrinfo[1] and addrinfo[1].family == "inet6" then
                        typ = "tcp6"
+               else
+                       typ = "tcp"
                end
        end
-       local create = socket[typ or "tcp"]
+       local create = socket[typ]
        if type( create ) ~= "function"  then
                return nil, "invalid socket type"
        end
        end
        client:settimeout( 0 )  -- set nonblocking
        local res, err = client:connect( addr, serverport )  -- connect
-       if res or ( err == "timeout" or err == "Operation already in progress" ) then
-               if client.getsockname then
-                       addr = client:getsockname( )
-               end
-               local interface = wrapclient( client, addr, serverport, listener, pattern, sslctx )
+       if res or ( err == "timeout" ) then
+               local ip, port = client:getsockname( )
+               local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx )
+               interface:_start_connection( sslctx )
                debug( "new connection id:", interface.id )
                return interface, err
        else
@@@ -798,20 -803,6 +803,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,