Diff

plugins/mod_c2s.lua @ 10811:16bcbd574801

mod_c2s: Run stream open and close events in async thread, fixes #1103 Enables async processing during stream opening and closing.
author Kim Alvefur <zash@zash.se>
date Fri, 08 May 2020 23:58:24 +0200
parent 10727:fa2a89132dfb
child 10849:19e7092e062c
line wrap: on
line diff
--- a/plugins/mod_c2s.lua	Fri May 08 23:55:51 2020 +0200
+++ b/plugins/mod_c2s.lua	Fri May 08 23:58:24 2020 +0200
@@ -55,6 +55,11 @@
 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'};
 
 function stream_callbacks.streamopened(session, attr)
+	-- run _streamopened in async context
+	session.thread:run({ stream = "opened", attr = attr });
+end
+
+function stream_callbacks._streamopened(session, attr)
 	local send = session.send;
 	if not attr.to then
 		session:close{ condition = "improper-addressing",
@@ -121,7 +126,12 @@
 	end
 end
 
-function stream_callbacks.streamclosed(session)
+function stream_callbacks.streamclosed(session, attr)
+	-- run _streamclosed in async context
+	session.thread:run({ stream = "closed", attr = attr });
+end
+
+function stream_callbacks._streamclosed(session)
 	session.log("debug", "Received </stream:stream>");
 	session:close(false);
 end
@@ -280,7 +290,13 @@
 	end
 
 	session.thread = runner(function (stanza)
-		core_process_stanza(session, stanza);
+		if st.is_stanza(stanza) then
+			core_process_stanza(session, stanza);
+		elseif stanza.stream == "opened" then
+			stream_callbacks._streamopened(session, stanza.attr);
+		elseif stanza.stream == "closed" then
+			stream_callbacks._streamclosed(session, stanza.attr);
+		end
 	end, runner_callbacks, session);
 
 	local filter = session.filter;