mod_compression: Enabeling compression for outgoing s2s streams.

Mon, 30 Nov 2009 23:23:42 +0100

author
Tobias Markmann <tm@ayena.de>
date
Mon, 30 Nov 2009 23:23:42 +0100
changeset 2284
e0b2d934f316
parent 2283
3dd7fdee9035
child 2285
efea91c740a2

mod_compression: Enabeling compression for outgoing s2s streams.

plugins/mod_compression.lua file | annotate | diff | comparison | revisions
--- a/plugins/mod_compression.lua	Sun Nov 29 23:43:12 2009 +0100
+++ b/plugins/mod_compression.lua	Mon Nov 30 23:23:42 2009 +0100
@@ -38,7 +38,10 @@
 		function (data)
 			local session, features = data.session, data.features;
 			-- FIXME only advertise compression support when TLS layer has no compression enabled
-			features:add_child(compression_stream_feature);
+			if not session.compressed then 
+				module:log("debug", "s2s-stream-features YAY YAHOO")
+				features:add_child(compression_stream_feature);
+			end
 		end
 );
 
@@ -97,6 +100,8 @@
 	local old_send = (session.sends2s or session.send);
 	
 	local new_send = function(t)
+			--TODO: Better code injection in the sending process
+			session.log(t)
 			local status, compressed, eof = pcall(deflate_stream, tostring(t), 'sync');
 			if status == false then
 				session:close({
@@ -107,7 +112,7 @@
 				module:log("warn", compressed);
 				return;
 			end
-			old_send(compressed);
+			session.conn:write(compressed);
 		end;
 	
 	if session.sends2s then session.sends2s = new_send
@@ -136,6 +141,30 @@
 module:add_handler({"s2sout_unauthed", "s2sout"}, "compressed", xmlns_compression_protocol, 
 		function(session ,stanza)
 			session.log("debug", "Activating compression...")
+			-- create deflate and inflate streams
+			deflate_stream = get_deflate_stream(session);
+			if not deflate_stream then return end
+			
+			inflate_stream = get_inflate_stream(session);
+			if not inflate_stream then return end
+			
+			-- setup compression for session.w
+			setup_compression(session, deflate_stream);
+				
+			-- setup decompression for session.data
+			setup_decompression(session, inflate_stream);
+			local session_reset_stream = session.reset_stream;
+			session.reset_stream = function(session)
+					session_reset_stream(session);
+					setup_decompression(session, inflate_stream);
+					return true;
+				end;
+			session:reset_stream();
+			local default_stream_attr = {xmlns = "jabber:server", ["xmlns:stream"] = "http://etherx.jabber.org/streams",
+										version = "1.0", to = session.to_host, from = session.from_host};
+			session.sends2s("<?xml version='1.0'?>");
+			session.sends2s(st.stanza("stream:stream", default_stream_attr):top_tag());			
+			session.compressed = true;
 		end
 );
 
@@ -144,7 +173,7 @@
 			-- fail if we are already compressed
 			if session.compressed then
 				local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method");
-				session.send(error_st);
+				(session.sends2s or session.send)(error_st);
 				session.log("warn", "Tried to establish another compression layer.");
 			end
 			
@@ -152,8 +181,6 @@
 			local method = stanza:child_with_name("method")[1];
 			if method == "zlib" then
 				session.log("info", method.." compression selected.");
-				(session.sends2s or session.send)(st.stanza("compressed", {xmlns=xmlns_compression_protocol}));
-				session:reset_stream();
 				
 				-- create deflate and inflate streams
 				deflate_stream = get_deflate_stream(session);
@@ -162,6 +189,9 @@
 				inflate_stream = get_inflate_stream(session);
 				if not inflate_stream then return end
 				
+				(session.sends2s or session.send)(st.stanza("compressed", {xmlns=xmlns_compression_protocol}));
+				session:reset_stream();
+				
 				-- setup compression for session.w
 				setup_compression(session, deflate_stream);
 					

mercurial