Software /
code /
prosody
Comparison
core/s2smanager.lua @ 2879:94299e640ed0
Merge with 0.7 (and indirectly 0.6.2)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 15 Mar 2010 03:18:33 +0000 |
parent | 2749:8dc5f3651501 |
child | 2892:9f214431de29 |
comparison
equal
deleted
inserted
replaced
2744:887d3a0e1e4e | 2879:94299e640ed0 |
---|---|
14 local add_task = require "util.timer".add_task; | 14 local add_task = require "util.timer".add_task; |
15 local socket = require "socket"; | 15 local socket = require "socket"; |
16 local format = string.format; | 16 local format = string.format; |
17 local t_insert, t_sort = table.insert, table.sort; | 17 local t_insert, t_sort = table.insert, table.sort; |
18 local get_traceback = debug.traceback; | 18 local get_traceback = debug.traceback; |
19 local tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber | 19 local tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber, |
20 = tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber; | 20 setmetatable |
21 = tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber, | |
22 setmetatable; | |
21 | 23 |
22 local idna_to_ascii = require "util.encodings".idna.to_ascii; | 24 local idna_to_ascii = require "util.encodings".idna.to_ascii; |
23 local connlisteners_get = require "net.connlisteners".get; | 25 local connlisteners_get = require "net.connlisteners".get; |
24 local wrapclient = require "net.server".wrapclient; | 26 local wrapclient = require "net.server".wrapclient; |
25 local modulemanager = require "core.modulemanager"; | 27 local modulemanager = require "core.modulemanager"; |
430 end | 432 end |
431 session.notopen = nil; | 433 session.notopen = nil; |
432 end | 434 end |
433 | 435 |
434 function streamclosed(session) | 436 function streamclosed(session) |
435 (session.log or log)("debug", "</stream:stream>"); | 437 (session.log or log)("debug", "Received </stream:stream>"); |
436 if session.sends2s then | 438 session:close(); |
437 session.sends2s("</stream:stream>"); | |
438 end | |
439 session.notopen = true; | |
440 end | 439 end |
441 | 440 |
442 function initiate_dialback(session) | 441 function initiate_dialback(session) |
443 -- generate dialback key | 442 -- generate dialback key |
444 session.dialback_key = generate_dialback(session.streamid, session.to_host, session.from_host); | 443 session.dialback_key = generate_dialback(session.streamid, session.to_host, session.from_host); |
508 | 507 |
509 session.srv_hosts = nil; | 508 session.srv_hosts = nil; |
510 end | 509 end |
511 end | 510 end |
512 | 511 |
513 local function null_data_handler(conn, data) log("debug", "Discarding data from destroyed s2s session: %s", data); end | 512 local resting_session = { -- Resting, not dead |
513 destroyed = true; | |
514 open_stream = function (session) | |
515 session.log("debug", "Attempt to open stream on resting session"); | |
516 end; | |
517 close = function (session) | |
518 session.log("debug", "Attempt to close already-closed session"); | |
519 end; | |
520 }; resting_session.__index = resting_session; | |
521 | |
522 function retire_session(session) | |
523 local log = session.log or log; | |
524 for k in pairs(session) do | |
525 if k ~= "trace" and k ~= "log" and k ~= "id" then | |
526 session[k] = nil; | |
527 end | |
528 end | |
529 | |
530 function session.send(data) log("debug", "Discarding data sent to resting session: %s", tostring(data)); end | |
531 function session.data(data) log("debug", "Discarding data received from resting session: %s", tostring(data)); end | |
532 return setmetatable(session, resting_session); | |
533 end | |
514 | 534 |
515 function destroy_session(session, reason) | 535 function destroy_session(session, reason) |
536 if session.destroyed then return; end | |
516 (session.log or log)("info", "Destroying "..tostring(session.direction).." session "..tostring(session.from_host).."->"..tostring(session.to_host)); | 537 (session.log or log)("info", "Destroying "..tostring(session.direction).." session "..tostring(session.from_host).."->"..tostring(session.to_host)); |
517 | 538 |
518 if session.direction == "outgoing" then | 539 if session.direction == "outgoing" then |
519 hosts[session.from_host].s2sout[session.to_host] = nil; | 540 hosts[session.from_host].s2sout[session.to_host] = nil; |
520 bounce_sendq(session, reason); | 541 bounce_sendq(session, reason); |
521 elseif session.direction == "incoming" then | 542 elseif session.direction == "incoming" then |
522 incoming_s2s[session] = nil; | 543 incoming_s2s[session] = nil; |
523 end | 544 end |
524 | 545 |
525 for k in pairs(session) do | 546 retire_session(session); -- Clean session until it is GC'd |
526 if k ~= "trace" then | |
527 session[k] = nil; | |
528 end | |
529 end | |
530 session.data = null_data_handler; | |
531 end | 547 end |
532 | 548 |
533 return _M; | 549 return _M; |