Mercurial > prosody-hg
comparison plugins/mod_compression.lua @ 2887:765e7070d0a8
Merge with 0.6 (into 0.7, namely mod_compression fixes)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 17 Mar 2010 14:28:26 +0000 |
| parents | afa20941e098 3baee526d714 |
| children | 9f214431de29 |
comparison
equal
deleted
inserted
replaced
| 2878:9384ee36fc03 | 2887:765e7070d0a8 |
|---|---|
| 6 -- | 6 -- |
| 7 | 7 |
| 8 local st = require "util.stanza"; | 8 local st = require "util.stanza"; |
| 9 local zlib = require "zlib"; | 9 local zlib = require "zlib"; |
| 10 local pcall = pcall; | 10 local pcall = pcall; |
| 11 local tostring = tostring; | |
| 12 | |
| 11 local xmlns_compression_feature = "http://jabber.org/features/compress" | 13 local xmlns_compression_feature = "http://jabber.org/features/compress" |
| 12 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" | 14 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" |
| 13 local xmlns_stream = "http://etherx.jabber.org/streams"; | 15 local xmlns_stream = "http://etherx.jabber.org/streams"; |
| 14 local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); | 16 local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); |
| 15 | 17 |
| 69 local status, deflate_stream = pcall(zlib.deflate, compression_level); | 71 local status, deflate_stream = pcall(zlib.deflate, compression_level); |
| 70 if status == false then | 72 if status == false then |
| 71 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); | 73 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
| 72 (session.sends2s or session.send)(error_st); | 74 (session.sends2s or session.send)(error_st); |
| 73 session.log("error", "Failed to create zlib.deflate filter."); | 75 session.log("error", "Failed to create zlib.deflate filter."); |
| 74 module:log("error", deflate_stream); | 76 module:log("error", "%s", tostring(deflate_stream)); |
| 75 return | 77 return |
| 76 end | 78 end |
| 77 return deflate_stream | 79 return deflate_stream |
| 78 end | 80 end |
| 79 | 81 |
| 81 local function get_inflate_stream(session) | 83 local function get_inflate_stream(session) |
| 82 local status, inflate_stream = pcall(zlib.inflate); | 84 local status, inflate_stream = pcall(zlib.inflate); |
| 83 if status == false then | 85 if status == false then |
| 84 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); | 86 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
| 85 (session.sends2s or session.send)(error_st); | 87 (session.sends2s or session.send)(error_st); |
| 86 session.log("error", "Failed to create zlib.deflate filter."); | 88 session.log("error", "Failed to create zlib.inflate filter."); |
| 87 module:log("error", inflate_stream); | 89 module:log("error", "%s", tostring(inflate_stream)); |
| 88 return | 90 return |
| 89 end | 91 end |
| 90 return inflate_stream | 92 return inflate_stream |
| 91 end | 93 end |
| 92 | 94 |
| 102 session:close({ | 104 session:close({ |
| 103 condition = "undefined-condition"; | 105 condition = "undefined-condition"; |
| 104 text = compressed; | 106 text = compressed; |
| 105 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); | 107 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
| 106 }); | 108 }); |
| 107 module:log("warn", compressed); | 109 module:log("warn", "%s", tostring(compressed)); |
| 108 return; | 110 return; |
| 109 end | 111 end |
| 110 session.conn:write(compressed); | 112 session.conn:write(compressed); |
| 111 end; | 113 end; |
| 112 | 114 |
| 123 session:close({ | 125 session:close({ |
| 124 condition = "undefined-condition"; | 126 condition = "undefined-condition"; |
| 125 text = decompressed; | 127 text = decompressed; |
| 126 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); | 128 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
| 127 }); | 129 }); |
| 128 module:log("warn", decompressed); | 130 module:log("warn", "%s", tostring(decompressed)); |
| 129 return; | 131 return; |
| 130 end | 132 end |
| 131 old_data(conn, decompressed); | 133 old_data(conn, decompressed); |
| 132 end; | 134 end; |
| 133 end | 135 end |
| 164 | 166 |
| 165 module:add_handler({"c2s_unauthed", "c2s", "s2sin_unauthed", "s2sin"}, "compress", xmlns_compression_protocol, | 167 module:add_handler({"c2s_unauthed", "c2s", "s2sin_unauthed", "s2sin"}, "compress", xmlns_compression_protocol, |
| 166 function(session, stanza) | 168 function(session, stanza) |
| 167 -- fail if we are already compressed | 169 -- fail if we are already compressed |
| 168 if session.compressed then | 170 if session.compressed then |
| 169 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); | 171 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
| 170 (session.sends2s or session.send)(error_st); | 172 (session.sends2s or session.send)(error_st); |
| 171 session.log("warn", "Tried to establish another compression layer."); | 173 session.log("warn", "Tried to establish another compression layer."); |
| 174 return; | |
| 172 end | 175 end |
| 173 | 176 |
| 174 -- checking if the compression method is supported | 177 -- checking if the compression method is supported |
| 175 local method = stanza:child_with_name("method")[1]; | 178 local method = stanza:child_with_name("method"); |
| 179 method = method and (method[1] or ""); | |
| 176 if method == "zlib" then | 180 if method == "zlib" then |
| 177 session.log("debug", method.." compression selected."); | 181 session.log("debug", "%s compression selected.", tostring(method)); |
| 178 | 182 |
| 179 -- create deflate and inflate streams | 183 -- create deflate and inflate streams |
| 180 local deflate_stream = get_deflate_stream(session); | 184 local deflate_stream = get_deflate_stream(session); |
| 181 if not deflate_stream then return end | 185 if not deflate_stream then return end |
| 182 | 186 |
| 197 session_reset_stream(session); | 201 session_reset_stream(session); |
| 198 setup_decompression(session, inflate_stream); | 202 setup_decompression(session, inflate_stream); |
| 199 return true; | 203 return true; |
| 200 end; | 204 end; |
| 201 session.compressed = true; | 205 session.compressed = true; |
| 202 else | 206 elseif method then |
| 203 session.log("warn", method.." compression selected. But we don't support it."); | 207 session.log("info", "%s compression selected, but we don't support it.", tostring(method)); |
| 204 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); | 208 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); |
| 205 (session.sends2s or session.send)(error_st); | 209 (session.sends2s or session.send)(error_st); |
| 210 else | |
| 211 (session.sends2s or session.send)(st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed")); | |
| 206 end | 212 end |
| 207 end | 213 end |
| 208 ); | 214 ); |
| 209 | 215 |
