Mercurial > prosody-modules
comparison mod_s2s_idle_timeout/mod_s2s_idle_timeout.lua @ 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 | |
children | 4e235e565693 |
comparison
equal
deleted
inserted
replaced
126:e190c1643a8f | 127:6c454d7208ae |
---|---|
1 local now = os.time; | |
2 | |
3 local s2smanager = require "core.s2smanager"; | |
4 local timer = require "util.timer"; | |
5 | |
6 local s2s_sessions = setmetatable({}, { __mode = "kv" }); | |
7 | |
8 local idle_timeout = module:get_option("s2s_idle_timeout") or 300; | |
9 local check_interval = math.ceil(idle_timeout * 0.75); | |
10 local _make_authenticated = s2smanager.make_authenticated; | |
11 function s2smanager.make_authenticated(session, host) | |
12 if not session.last_received_time then | |
13 session.last_received_time = now(); | |
14 if session.direction == "incoming" then | |
15 local _data = session.data; | |
16 function session.data(conn, data) | |
17 session.last_received_time = now(); | |
18 return _data(conn, data); | |
19 end | |
20 else | |
21 local _sends2s = session.sends2s; | |
22 function session.sends2s(data) | |
23 session.last_received_time = now(); | |
24 return _sends2s(data); | |
25 end | |
26 end | |
27 s2s_sessions[session] = true; | |
28 end | |
29 return _make_authenticated(session, host); | |
30 end | |
31 | |
32 function check_idle_sessions(time) | |
33 time = time or now(); | |
34 for session in pairs(s2s_sessions) do | |
35 local last_received_time = session.last_received_time; | |
36 if last_received_time and time - last_received_time > idle_timeout then | |
37 module:log("debug", "Closing idle connection %s->%s", | |
38 session.from_host or "(unknown)", session.to_host or "(unknown)"); | |
39 session:close(); -- Close-on-idle isn't an error | |
40 s2s_sessions[session] = nil; | |
41 end | |
42 end | |
43 return check_interval; | |
44 end | |
45 timer.add_task(check_interval, check_idle_sessions); | |
46 | |
47 function module.save() | |
48 return { s2s_sessions = s2s_sessions }; | |
49 end | |
50 | |
51 function module.restore(data) | |
52 s2s_sessions = setmetatable(data.s2s_sessions or {}, { __mode = "kv" }); | |
53 end |