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;