Software /
code /
prosody
Changeset
1671:d196ac213104
Actually inject de- and compression into the reading/writing functions.
author | Tobias Markmann <tm@ayena.de> |
---|---|
date | Thu, 13 Aug 2009 09:34:27 +0200 |
parents | 1670:23bb280c5eac |
children | 1672:614623f393c6 |
files | plugins/mod_compression.lua |
diffstat | 1 files changed, 33 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/mod_compression.lua Wed Aug 12 20:09:07 2009 +0200 +++ b/plugins/mod_compression.lua Thu Aug 13 09:34:27 2009 +0200 @@ -6,6 +6,7 @@ -- local st = require "util.stanza"; +local zlib = require "zlib"; local print = print local xmlns_compression_feature = "http://jabber.org/features/compress" @@ -15,7 +16,7 @@ module:add_event_hook("stream-features", function (session, features) - features:add_child(compression_stream_feature); + if not session.compressed then features:add_child(compression_stream_feature); end end ); @@ -26,6 +27,37 @@ if method == "zlib" then session.log("info", method.." compression selected."); session.send(st.stanza("compressed", {xmlns=xmlns_compression_protocol})); + session:reset_stream(); + + -- create deflate and inflate streams + local deflate_stream = zlib.deflate(9); + local inflate_stream = zlib.inflate(); + + -- setup compression for session.w + local old_send = session.send; + + session.send = function(t) + local compressed, eof = deflate_stream(tostring(t), 'sync'); + old_send(compressed); + end; + + -- setup decompression for session.data + local function setup_decompression(session) + local old_data = session.data + session.data = function(conn, data) + local decompressed, eof = inflate_stream(data); + old_data(conn, decompressed); + end; + end + setup_decompression(session); + + local session_reset_stream = session.reset_stream; + session.reset_stream = function(session) + session_reset_stream(session); + setup_decompression(session); + return true; + end; + session.compressed = true; else session.log("info", method.." compression selected. But we don't support it."); local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method");