Merge 0.10->trunk
[prosody.git] / net / server_event.lua
index 4589c947005c4b78217d9510dd99a7910947b316..08524646c19e4ebf2aa63e89f1e4d6e92ae1a648 100644 (file)
@@ -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"
@@ -409,10 +409,13 @@ end
 
 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
@@ -515,8 +518,11 @@ local function handleclient( client, ip, port, server, pattern, listener, sslctx
                                elseif interface.startsslcallback then  -- start ssl connection if needed
                                        debug "starting ssl handshake after writing"
                                        interface.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, interface.startsslcallback, 0 )
+                               elseif interface.writebufferlen ~= 0 then
+                                       -- data possibly written from ondrain
+                                       return EV_WRITE, cfg.WRITE_TIMEOUT
                                elseif interface.eventreadtimeout then
-                                       return EV_WRITE, EV_TIMEOUT
+                                       return EV_WRITE, cfg.WRITE_TIMEOUT
                                end
                                interface.eventwrite = nil
                                return -1
@@ -727,7 +733,6 @@ local function addclient( addr, serverport, listener, pattern, sslctx, typ )
        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
@@ -800,6 +805,20 @@ local function link(sender, receiver, buffersize)
        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,
@@ -815,6 +834,7 @@ return {
        closeall = closeallservers,
        get_backend = get_backend,
        hook_signal = hook_signal,
+       add_task = add_task,
 
        __NAME = SCRIPT_NAME,
        __DATE = LAST_MODIFIED,