plugins/mod_compression.lua

changeset 3532
4f2cd1c688e1
parent 3301
772fb30b28fb
child 3540
bc139431830b
equal deleted inserted replaced
3531:f41e1cfe92f4 3532:4f2cd1c688e1
125 end 125 end
126 return decompressed; 126 return decompressed;
127 end); 127 end);
128 end 128 end
129 129
130 module:add_handler({"s2sout_unauthed", "s2sout"}, "compressed", xmlns_compression_protocol, 130 module:hook("stanza/http://jabber.org/protocol/compress:compressed", function(event)
131 function(session ,stanza) 131 local session = event.origin;
132 session.log("debug", "Activating compression...") 132
133 if session.type == "s2sout_unauthed" or session.type == "s2sout" then
134 session.log("debug", "Activating compression...")
135 -- create deflate and inflate streams
136 local deflate_stream = get_deflate_stream(session);
137 if not deflate_stream then return true; end
138
139 local inflate_stream = get_inflate_stream(session);
140 if not inflate_stream then return true; end
141
142 -- setup compression for session.w
143 setup_compression(session, deflate_stream);
144
145 -- setup decompression for session.data
146 setup_decompression(session, inflate_stream);
147 session:reset_stream();
148 local default_stream_attr = {xmlns = "jabber:server", ["xmlns:stream"] = "http://etherx.jabber.org/streams",
149 ["xmlns:db"] = 'jabber:server:dialback', version = "1.0", to = session.to_host, from = session.from_host};
150 session.sends2s("<?xml version='1.0'?>");
151 session.sends2s(st.stanza("stream:stream", default_stream_attr):top_tag());
152 session.compressed = true;
153 return true;
154 end
155 end);
156
157 module:hook("stanza/http://jabber.org/protocol/compress:compress", function(event)
158 local session, stanza = event.origin, event.stanza;
159
160 if session.type == "c2s" or session.type == "s2sin" or session.type == "c2s_unauthed" or session.type == "s2sin_unauthed" then
161 -- fail if we are already compressed
162 if session.compressed then
163 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed");
164 (session.sends2s or session.send)(error_st);
165 session.log("debug", "Client tried to establish another compression layer.");
166 return true;
167 end
168
169 -- checking if the compression method is supported
170 local method = stanza:child_with_name("method");
171 method = method and (method[1] or "");
172 if method == "zlib" then
173 session.log("debug", "zlib compression enabled.");
174
133 -- create deflate and inflate streams 175 -- create deflate and inflate streams
134 local deflate_stream = get_deflate_stream(session); 176 local deflate_stream = get_deflate_stream(session);
135 if not deflate_stream then return end 177 if not deflate_stream then return true; end
136 178
137 local inflate_stream = get_inflate_stream(session); 179 local inflate_stream = get_inflate_stream(session);
138 if not inflate_stream then return end 180 if not inflate_stream then return true; end
181
182 (session.sends2s or session.send)(st.stanza("compressed", {xmlns=xmlns_compression_protocol}));
183 session:reset_stream();
139 184
140 -- setup compression for session.w 185 -- setup compression for session.w
141 setup_compression(session, deflate_stream); 186 setup_compression(session, deflate_stream);
142 187
143 -- setup decompression for session.data 188 -- setup decompression for session.data
144 setup_decompression(session, inflate_stream); 189 setup_decompression(session, inflate_stream);
145 session:reset_stream(); 190
146 local default_stream_attr = {xmlns = "jabber:server", ["xmlns:stream"] = "http://etherx.jabber.org/streams",
147 ["xmlns:db"] = 'jabber:server:dialback', version = "1.0", to = session.to_host, from = session.from_host};
148 session.sends2s("<?xml version='1.0'?>");
149 session.sends2s(st.stanza("stream:stream", default_stream_attr):top_tag());
150 session.compressed = true; 191 session.compressed = true;
151 end 192 elseif method then
152 ); 193 session.log("debug", "%s compression selected, but we don't support it.", tostring(method));
153 194 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method");
154 module:add_handler({"c2s_unauthed", "c2s", "s2sin_unauthed", "s2sin"}, "compress", xmlns_compression_protocol, 195 (session.sends2s or session.send)(error_st);
155 function(session, stanza) 196 else
156 -- fail if we are already compressed 197 (session.sends2s or session.send)(st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"));
157 if session.compressed then 198 end
158 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); 199 return true;
159 (session.sends2s or session.send)(error_st); 200 end
160 session.log("debug", "Client tried to establish another compression layer."); 201 end);
161 return; 202
162 end
163
164 -- checking if the compression method is supported
165 local method = stanza:child_with_name("method");
166 method = method and (method[1] or "");
167 if method == "zlib" then
168 session.log("debug", "zlib compression enabled.");
169
170 -- create deflate and inflate streams
171 local deflate_stream = get_deflate_stream(session);
172 if not deflate_stream then return end
173
174 local inflate_stream = get_inflate_stream(session);
175 if not inflate_stream then return end
176
177 (session.sends2s or session.send)(st.stanza("compressed", {xmlns=xmlns_compression_protocol}));
178 session:reset_stream();
179
180 -- setup compression for session.w
181 setup_compression(session, deflate_stream);
182
183 -- setup decompression for session.data
184 setup_decompression(session, inflate_stream);
185
186 session.compressed = true;
187 elseif method then
188 session.log("debug", "%s compression selected, but we don't support it.", tostring(method));
189 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method");
190 (session.sends2s or session.send)(error_st);
191 else
192 (session.sends2s or session.send)(st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"));
193 end
194 end
195 );
196

mercurial