Merge 0.9->0.10
[prosody.git] / net / server_event.lua
index ec8af2a4da839383a4ca9e40e96d0e774fc5307a..1329a43d67abc0933f234b3af829763afaf28453 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"
@@ -257,8 +257,9 @@ end
 
 function interface_mt:resume()
        self:_lock(self.nointerface, false, self.nowriting);
-       if 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;
        end
 end
 
@@ -390,7 +391,8 @@ function interface_mt:starttls(sslctx, call_onconnect)
        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
@@ -407,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
@@ -513,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
@@ -580,9 +588,9 @@ local function handleclient( client, ip, port, server, pattern, listener, sslctx
                                        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...
@@ -614,6 +622,7 @@ local function handleserver( server, addr, port, pattern, listener, sslctx )  --
        local interface = {
                _connections = 0;
 
+               type = "server";
                conn = server;
                onconnect = listener.onconnect;  -- will be called when new client connected
                eventread = false;  -- read event handler
@@ -724,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