X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fserver_select.lua;h=486e953b6cb0269f3c1eb94b762fdc5be118e912;hb=f6b3f550857678d676b31c5338f4bc6a93df1339;hp=4721d6ad877ec32bc4702e70f852eaf4575b6915;hpb=ac8c3154923599cf1226ae4d7ea5a6ab0d473ea5;p=prosody.git diff --git a/net/server_select.lua b/net/server_select.lua index 4721d6ad..486e953b 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -285,6 +285,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport local disconnect = listeners.ondisconnect local drain = listeners.ondrain local onreadtimeout = listeners.onreadtimeout; + local detach = listeners.ondetach local bufferqueue = { } -- buffer array local bufferqueuelen = 0 -- end of buffer array @@ -316,11 +317,15 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport handler.onreadtimeout = onreadtimeout; handler.setlistener = function( self, listeners ) + if detach then + detach(self) -- Notify listener that it is no longer responsible for this connection + end dispatch = listeners.onincoming disconnect = listeners.ondisconnect status = listeners.onstatus drain = listeners.ondrain handler.onreadtimeout = listeners.onreadtimeout + detach = listeners.ondetach end handler.getstats = function( ) return readtraffic, sendtraffic @@ -401,6 +406,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport handler.clientport = function( ) return clientport end + handler.port = handler.clientport -- COMPAT server_event local write = function( self, data ) bufferlen = bufferlen + #data if bufferlen > maxsendlen then @@ -562,6 +568,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport _ = status and status( handler, "ssl-handshake-complete" ) if self.autostart_ssl and listeners.onconnect then listeners.onconnect(self); + if bufferqueuelen ~= 0 then + _sendlistlen = addsocket(_sendlist, client, _sendlistlen) + end end _readlistlen = addsocket(_readlist, client, _readlistlen) return true @@ -708,6 +717,7 @@ local function link(sender, receiver, buffersize) sender:lock_read(true); end end + sender:set_mode("*a"); end ----------------------------------// PUBLIC //-- @@ -876,6 +886,8 @@ loop = function(once) -- this is the main loop of the program if not(handler.onreadtimeout) or handler:onreadtimeout() ~= true then handler.disconnect( )( handler, "read timeout" ) handler:close( ) -- forced disconnect? + else + _readtimes[ handler ] = _currenttime -- reset timer end end end @@ -920,13 +932,9 @@ local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx -- When socket is writeable, call onconnect local _sendbuffer = handler.sendbuffer; handler.sendbuffer = function () - _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ); handler.sendbuffer = _sendbuffer; listeners.onconnect(handler); - -- If there was data with the incoming packet, handle it now. - if #handler:bufferqueue() > 0 then - return _sendbuffer(); - end + return _sendbuffer(); -- Send any queued outgoing data end end end