diff options
author | Matthew Wild <mwild1@gmail.com> | 2010-05-05 15:24:24 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2010-05-05 15:24:24 +0100 |
commit | 3c7eb58b08e7f416d73f86061706674d37f83c4f (patch) | |
tree | fbd2c8cecb1944a0c773220c1eb52ab40fa35046 /net | |
parent | 242d67b43e37e5fa4a831011f70a2429957f7b6b (diff) | |
download | prosody-3c7eb58b08e7f416d73f86061706674d37f83c4f.tar.gz prosody-3c7eb58b08e7f416d73f86061706674d37f83c4f.zip |
net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Diffstat (limited to 'net')
-rw-r--r-- | net/server_event.lua | 3 | ||||
-rw-r--r-- | net/server_select.lua | 7 |
2 files changed, 9 insertions, 1 deletions
diff --git a/net/server_event.lua b/net/server_event.lua index bbc9a527..8eaa96da 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -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 diff --git a/net/server_select.lua b/net/server_select.lua index 475e8aca..9bc112bb 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -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 |