Software / code / prosody
Comparison
plugins/mod_compression.lua @ 3148:a83a995fe5db
mod_compression: Use filters! \o/
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 02 Jun 2010 18:24:56 +0100 |
| parent | 3127:94639081f327 |
| child | 3202:1a8a5b89a5ad |
comparison
equal
deleted
inserted
replaced
| 3147:bc8c31399520 | 3148:a83a995fe5db |
|---|---|
| 12 | 12 |
| 13 local xmlns_compression_feature = "http://jabber.org/features/compress" | 13 local xmlns_compression_feature = "http://jabber.org/features/compress" |
| 14 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" | 14 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" |
| 15 local xmlns_stream = "http://etherx.jabber.org/streams"; | 15 local xmlns_stream = "http://etherx.jabber.org/streams"; |
| 16 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(); |
| 17 local add_filter = require "util.filters".add_filter; | |
| 17 | 18 |
| 18 local compression_level = module:get_option("compression_level"); | 19 local compression_level = module:get_option("compression_level"); |
| 19 -- if not defined assume admin wants best compression | 20 -- if not defined assume admin wants best compression |
| 20 if compression_level == nil then compression_level = 9 end; | 21 if compression_level == nil then compression_level = 9 end; |
| 21 | 22 |
| 92 return inflate_stream | 93 return inflate_stream |
| 93 end | 94 end |
| 94 | 95 |
| 95 -- setup compression for a stream | 96 -- setup compression for a stream |
| 96 local function setup_compression(session, deflate_stream) | 97 local function setup_compression(session, deflate_stream) |
| 97 local old_send = (session.sends2s or session.send); | 98 add_filter(session, "bytes/out", function(t) |
| 98 | 99 session.log(t) |
| 99 local new_send = function(t) | 100 local status, compressed, eof = pcall(deflate_stream, tostring(t), 'sync'); |
| 100 --TODO: Better code injection in the sending process | 101 if status == false then |
| 101 session.log(t) | 102 session:close({ |
| 102 local status, compressed, eof = pcall(deflate_stream, tostring(t), 'sync'); | 103 condition = "undefined-condition"; |
| 103 if status == false then | 104 text = compressed; |
| 104 session:close({ | 105 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
| 105 condition = "undefined-condition"; | 106 }); |
| 106 text = compressed; | 107 module:log("warn", "%s", tostring(compressed)); |
| 107 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); | 108 return; |
| 108 }); | 109 end |
| 109 module:log("warn", "%s", tostring(compressed)); | 110 return compressed; |
| 110 return; | 111 end); |
| 111 end | |
| 112 session.conn:write(compressed); | |
| 113 end; | |
| 114 | |
| 115 if session.sends2s then session.sends2s = new_send | |
| 116 elseif session.send then session.send = new_send end | |
| 117 end | 112 end |
| 118 | 113 |
| 119 -- setup decompression for a stream | 114 -- setup decompression for a stream |
| 120 local function setup_decompression(session, inflate_stream) | 115 local function setup_decompression(session, inflate_stream) |
| 121 local old_data = session.data | 116 add_filter(session, "bytes/in", function(data) |
| 122 session.data = function(data) | 117 local status, decompressed, eof = pcall(inflate_stream, data); |
| 123 local status, decompressed, eof = pcall(inflate_stream, data); | 118 if status == false then |
| 124 if status == false then | 119 session:close({ |
| 125 session:close({ | 120 condition = "undefined-condition"; |
| 126 condition = "undefined-condition"; | 121 text = decompressed; |
| 127 text = decompressed; | 122 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"); | 123 }); |
| 129 }); | 124 module:log("warn", "%s", tostring(decompressed)); |
| 130 module:log("warn", "%s", tostring(decompressed)); | 125 return; |
| 131 return; | 126 end |
| 132 end | 127 return decompressed; |
| 133 old_data(decompressed); | 128 end); |
| 134 end; | |
| 135 end | 129 end |
| 136 | 130 |
| 137 module:add_handler({"s2sout_unauthed", "s2sout"}, "compressed", xmlns_compression_protocol, | 131 module:add_handler({"s2sout_unauthed", "s2sout"}, "compressed", xmlns_compression_protocol, |
| 138 function(session ,stanza) | 132 function(session ,stanza) |
| 139 session.log("debug", "Activating compression...") | 133 session.log("debug", "Activating compression...") |