mirror of
https://github.com/bjc/prosody.git
synced 2025-04-03 21:27:38 +03:00
Abstract connections with "connection listeners"
- Added connlistener for xmppclient - SASL/TLS now use a new session:reset_stream() method - main.lua on its way to being a bit neater
This commit is contained in:
parent
d510d54b28
commit
ee7b432ab1
8 changed files with 137 additions and 89 deletions
|
@ -1,16 +0,0 @@
|
|||
|
||||
local lxp = require "lxp"
|
||||
local init_xmlhandlers = require "core.xmlhandlers"
|
||||
|
||||
module "connhandlers"
|
||||
|
||||
|
||||
function new(name, session)
|
||||
if name == "xmpp-client" then
|
||||
local parser = lxp.new(init_xmlhandlers(session), ":");
|
||||
local parse = parser.parse;
|
||||
return { data = function (self, data) return parse(parser, data); end, parser = parser }
|
||||
end
|
||||
end
|
||||
|
||||
return _M;
|
40
net/connlisteners.lua
Normal file
40
net/connlisteners.lua
Normal file
|
@ -0,0 +1,40 @@
|
|||
|
||||
local server_add = require "net.server".add;
|
||||
local log = require "util.logger".init("connlisteners");
|
||||
|
||||
local dofile, pcall, error =
|
||||
dofile, pcall, error
|
||||
|
||||
module "connlisteners"
|
||||
|
||||
local listeners = {};
|
||||
|
||||
function register(name, listener)
|
||||
if listeners[name] and listeners[name] ~= listener then
|
||||
log("warning", "Listener %s is already registered, not registering any more", name);
|
||||
return false;
|
||||
end
|
||||
listeners[name] = listener;
|
||||
log("info", "Registered connection listener %s", name);
|
||||
return true;
|
||||
end
|
||||
|
||||
function deregister(name)
|
||||
listeners[name] = nil;
|
||||
end
|
||||
|
||||
function start(name, udata)
|
||||
local h = listeners[name]
|
||||
if not h then
|
||||
pcall(dofile, "net/"..name:gsub("[^%w%-]", "_").."_listener.lua");
|
||||
h = listeners[name];
|
||||
if not h then
|
||||
error("No such connection module: "..name, 0);
|
||||
end
|
||||
end
|
||||
return server_add(h,
|
||||
udata.port or h.default_port or error("Can't start listener "..name.." because no port was specified, and it has no default port", 0),
|
||||
udata.interface or "*", udata.mode or h.default_mode or 1, udata.ssl );
|
||||
end
|
||||
|
||||
return _M;
|
74
net/xmppclient_listener.lua
Normal file
74
net/xmppclient_listener.lua
Normal file
|
@ -0,0 +1,74 @@
|
|||
|
||||
local logger = require "logger";
|
||||
local lxp = require "lxp"
|
||||
local init_xmlhandlers = require "core.xmlhandlers"
|
||||
local sm_new_session = require "core.sessionmanager".new_session;
|
||||
|
||||
local connlisteners_register = require "net.connlisteners".register;
|
||||
|
||||
local t_insert = table.insert;
|
||||
local t_concat = table.concat;
|
||||
local t_concatall = function (t, sep) local tt = {}; for _, s in ipairs(t) do t_insert(tt, tostring(s)); end return t_concat(tt, sep); end
|
||||
local m_random = math.random;
|
||||
local format = string.format;
|
||||
local sm_new_session, sm_destroy_session = sessionmanager.new_session, sessionmanager.destroy_session; --import("core.sessionmanager", "new_session", "destroy_session");
|
||||
local sm_streamopened = sessionmanager.streamopened;
|
||||
local st = stanza;
|
||||
|
||||
local sessions = {};
|
||||
local xmppclient = { default_port = 5222 };
|
||||
|
||||
-- These are session methods --
|
||||
|
||||
local function session_reset_stream(session)
|
||||
-- Reset stream
|
||||
local parser = lxp.new(init_xmlhandlers(session, sm_streamopened), ":");
|
||||
session.parser = parser;
|
||||
|
||||
session.notopen = true;
|
||||
|
||||
function session.data(conn, data)
|
||||
parser:parse(data);
|
||||
end
|
||||
return true;
|
||||
end
|
||||
|
||||
-- End of session methods --
|
||||
|
||||
function xmppclient.listener(conn, data)
|
||||
local session = sessions[conn];
|
||||
if not session then
|
||||
session = sm_new_session(conn);
|
||||
sessions[conn] = session;
|
||||
|
||||
-- Logging functions --
|
||||
|
||||
local mainlog, log = log;
|
||||
do
|
||||
local conn_name = tostring(conn):match("[a-f0-9]+$");
|
||||
log = logger.init(conn_name);
|
||||
end
|
||||
local print = function (...) log("info", t_concatall({...}, "\t")); end
|
||||
session.log = log;
|
||||
|
||||
print("Client connected");
|
||||
|
||||
session.reset_stream = session_reset_stream;
|
||||
|
||||
session_reset_stream(session); -- Initialise, ready for use
|
||||
|
||||
-- TODO: Below function should be session,stanza - and xmlhandlers should use :method() notation to call,
|
||||
-- this will avoid the useless indirection we have atm
|
||||
-- (I'm on a mission, no time to fix now)
|
||||
session.stanza_dispatch = function (stanza) return core_process_stanza(session, stanza); end
|
||||
|
||||
end
|
||||
if data then
|
||||
session.data(conn, data);
|
||||
end
|
||||
end
|
||||
|
||||
function xmppclient.disconnect(conn)
|
||||
end
|
||||
|
||||
connlisteners_register("xmppclient", xmppclient);
|
Loading…
Add table
Add a link
Reference in a new issue