Software /
code /
prosody-modules
Changeset
127:6c454d7208ae
mod_s2s_idle_timeout: Close idle connections after s2s_idle_timeout seconds, default 300s
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 28 Jan 2010 17:40:29 +0000 |
parents | 126:e190c1643a8f |
children | 128:bdd1641c159d |
files | mod_s2s_idle_timeout/mod_s2s_idle_timeout.lua |
diffstat | 1 files changed, 53 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_s2s_idle_timeout/mod_s2s_idle_timeout.lua Thu Jan 28 17:40:29 2010 +0000 @@ -0,0 +1,53 @@ +local now = os.time; + +local s2smanager = require "core.s2smanager"; +local timer = require "util.timer"; + +local s2s_sessions = setmetatable({}, { __mode = "kv" }); + +local idle_timeout = module:get_option("s2s_idle_timeout") or 300; +local check_interval = math.ceil(idle_timeout * 0.75); +local _make_authenticated = s2smanager.make_authenticated; +function s2smanager.make_authenticated(session, host) + if not session.last_received_time then + session.last_received_time = now(); + if session.direction == "incoming" then + local _data = session.data; + function session.data(conn, data) + session.last_received_time = now(); + return _data(conn, data); + end + else + local _sends2s = session.sends2s; + function session.sends2s(data) + session.last_received_time = now(); + return _sends2s(data); + end + end + s2s_sessions[session] = true; + end + return _make_authenticated(session, host); +end + +function check_idle_sessions(time) + time = time or now(); + for session in pairs(s2s_sessions) do + local last_received_time = session.last_received_time; + if last_received_time and time - last_received_time > idle_timeout then + module:log("debug", "Closing idle connection %s->%s", + session.from_host or "(unknown)", session.to_host or "(unknown)"); + session:close(); -- Close-on-idle isn't an error + s2s_sessions[session] = nil; + end + end + return check_interval; +end +timer.add_task(check_interval, check_idle_sessions); + +function module.save() + return { s2s_sessions = s2s_sessions }; +end + +function module.restore(data) + s2s_sessions = setmetatable(data.s2s_sessions or {}, { __mode = "kv" }); +end