net.server_select, net.server_event: Support for ondrain listener callback for when...
authorMatthew Wild <mwild1@gmail.com>
Wed, 5 May 2010 14:24:24 +0000 (15:24 +0100)
committerMatthew Wild <mwild1@gmail.com>
Wed, 5 May 2010 14:24:24 +0000 (15:24 +0100)
net/server_event.lua
net/server_select.lua

index bbc9a527857f1cb1cc14ce275d25de3f17e70973..8eaa96da149037f6603713d363bc55fa8fdcfb56 100644 (file)
@@ -465,6 +465,8 @@ do
        end
        function interface_mt:ontimeout()
        end
+       function interface_mt:ondrain()
+       end
        function interface_mt:onstatus()
                debug("server.lua: Dummy onstatus()")
        end
@@ -545,6 +547,7 @@ do
                                if succ then  -- writing succesful
                                        interface.writebuffer = ""
                                        interface.writebufferlen = 0
+                                       interface:ondrain();
                                        if interface.fatalerror then
                                                debug "closing client after writing"
                                                interface:_close()  -- close interface if needed
index 475e8aca1ca5e0f3b171967a3632dbd3c266863b..9bc112bbc08724b416821ff801741b37c4a8a7bf 100644 (file)
@@ -252,6 +252,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        local dispatch = listeners.onincoming
        local status = listeners.onstatus
        local disconnect = listeners.ondisconnect
+       local drain = listeners.ondrain
 
        local bufferqueue = { } -- buffer array
        local bufferqueuelen = 0        -- end of buffer array
@@ -284,6 +285,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                dispatch = listeners.onincoming
                disconnect = listeners.ondisconnect
                status = listeners.onstatus
+               drain = listeners.ondrain
        end
        handler.getstats = function( )
                return readtraffic, sendtraffic
@@ -437,7 +439,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        end
        local _readbuffer = function( ) -- this function reads data
                local buffer, err, part = receive( socket, pattern )    -- receive buffer with "pattern"
-               if not err or (err == "wantread" or err == "timeout") or (part and string_len(part) > 0) then -- received something
+               if not err or (err == "wantread" or err == "timeout") then -- received something
                        local buffer = buffer or part or ""
                        local len = string_len( buffer )
                        if len > maxreadlen then
@@ -479,6 +481,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist
                        _ = needtls and handler:starttls(nil, true)
                        _writetimes[ handler ] = nil
+                       if drain then
+                               drain(handler)
+                       end
                        _ = toclose and handler:close( )
                        return true
                elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write