net.server_event: Check the buffer *length*, not the buffer itself (Fixes 100% cpu...
[prosody.git] / net / server_event.lua
index e320b15c3b759539e4d8af00dcd3aacb06dc9f89..882d10ed95d0e45d3436ed663c73c84258bd4ddb 100644 (file)
@@ -289,8 +289,9 @@ do
 
        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
 
@@ -367,6 +368,7 @@ do
        function interface_mt:ssl()
                return self._usingssl
        end
+       interface_mt.clientport = interface_mt.port -- COMPAT server_select
 
        function interface_mt:type()
                return self._type or "client"
@@ -437,8 +439,11 @@ do
        end
        
        function interface_mt:setlistener(listener)
-               self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout, self.onstatus
-                       = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout, listener.onstatus;
+               self:ondetach(); -- Notify listener that it is no longer responsible for this connection
+               self.onconnect, self.ondisconnect, self.onincoming,
+               self.ontimeout, self.onstatus, self.ondetach
+                       = listener.onconnect, listener.ondisconnect, listener.onincoming,
+                       listener.ontimeout, listener.onstatus, listener.ondetach;
        end
        
        -- Stub handlers
@@ -452,6 +457,8 @@ do
        end
        function interface_mt:ondrain()
        end
+       function interface_mt:ondetach()
+       end
        function interface_mt:onstatus()
        end
 end
@@ -478,6 +485,7 @@ do
                        onincoming = listener.onincoming;  -- will be called when client sends data
                        ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
                        ondrain = listener.ondrain; -- called when writebuffer is empty
+                       ondetach = listener.ondetach; -- called when disassociating this listener from this connection
                        onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
                        eventread = false, eventwrite = false, eventclose = false,
                        eventhandshake = false, eventstarthandshake = false;  -- event handler
@@ -537,8 +545,11 @@ do
                                        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
@@ -846,6 +857,7 @@ local function link(sender, receiver, buffersize)
                        sender:pause();
                end
        end
+       sender:set_mode("*a");
 end
 
 return {