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 |
|