Software / code / prosody
Comparison
plugins/mod_compression.lua @ 3532:4f2cd1c688e1
mod_compression: Updated to use the new events API.
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sat, 16 Oct 2010 06:53:59 +0500 |
| parent | 3301:772fb30b28fb |
| child | 3540:bc139431830b |
comparison
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 |