X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_c2s.lua;h=e69bf461d2e3637219339dbaacd40ea577668cc2;hb=db2ebc9585c3d52cd30f913728fedb54d76298f2;hp=c638cd039897fc3866eacca4df17c41597182bdb;hpb=544e05fb68f869526b71194c3bed3edd7311f3fe;p=prosody.git diff --git a/plugins/mod_c2s.lua b/plugins/mod_c2s.lua index c638cd03..e69bf461 100644 --- a/plugins/mod_c2s.lua +++ b/plugins/mod_c2s.lua @@ -15,10 +15,9 @@ local sessionmanager = require "core.sessionmanager"; local st = require "util.stanza"; local sm_new_session, sm_destroy_session = sessionmanager.new_session, sessionmanager.destroy_session; local uuid_generate = require "util.uuid".generate; -local runner = require "util.async".runner; local xpcall, tostring, type = xpcall, tostring, type; -local t_insert, t_remove = table.insert, table.remove; +local traceback = debug.traceback; local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; @@ -36,7 +35,16 @@ local hosts = prosody.hosts; local stream_callbacks = { default_ns = "jabber:client" }; local listener = {}; -local runner_callbacks = {}; + +do + -- Connection counter resets to 0 on load and reload + -- Bump it up to current value + local count = 0; + for _ in pairs(sessions) do + count = count + 1; + end + measure_connections(count); +end --- Stream events handlers local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'}; @@ -123,9 +131,12 @@ function stream_callbacks.error(session, error, data) end end +local function handleerr(err) log("error", "Traceback[c2s]: %s", traceback(tostring(err), 2)); end function stream_callbacks.handlestanza(session, stanza) stanza = session.filter("stanzas/in", stanza); - session.thread:run(stanza); + if stanza then + return xpcall(function () return core_process_stanza(session, stanza) end, handleerr); + end end --- Session methods @@ -178,6 +189,9 @@ local function session_close(session, reason) sm_destroy_session(session, reason); conn:close(); end + else + local reason = (reason and (reason.name or reason.text or reason.condition)) or reason; + sm_destroy_session(session, reason); end end @@ -191,18 +205,6 @@ module:hook_global("user-deleted", function(event) end end, 200); -function runner_callbacks:ready() - self.data.conn:resume(); -end - -function runner_callbacks:waiting() - self.data.conn:pause(); -end - -function runner_callbacks:error(err) - (self.data.log or log)("error", "Traceback[c2s]: %s", err); -end - --- Port listener function listener.onconnect(conn) measure_connections(1); @@ -240,10 +242,6 @@ function listener.onconnect(conn) session.stream:reset(); end - session.thread = runner(function (stanza) - core_process_stanza(session, stanza); - end, runner_callbacks, session); - local filter = session.filter; function session.data(data) -- Parse the data, which will store stanzas in session.pending_stanzas @@ -283,6 +281,7 @@ function listener.ondisconnect(conn, err) if session then (session.log or log)("info", "Client disconnected: %s", err or "connection closed"); sm_destroy_session(session, err); + session.conn = nil; sessions[conn] = nil; end end