Software / code / prosody
Comparison
plugins/mod_compression.lua @ 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 |
| parent | 1670:23bb280c5eac |
| child | 1672:614623f393c6 |
comparison
equal
deleted
inserted
replaced
| 1670:23bb280c5eac | 1671:d196ac213104 |
|---|---|
| 4 -- This project is MIT/X11 licensed. Please see the | 4 -- This project is MIT/X11 licensed. Please see the |
| 5 -- COPYING file in the source package for more information. | 5 -- COPYING file in the source package for more information. |
| 6 -- | 6 -- |
| 7 | 7 |
| 8 local st = require "util.stanza"; | 8 local st = require "util.stanza"; |
| 9 local zlib = require "zlib"; | |
| 9 local print = print | 10 local print = print |
| 10 | 11 |
| 11 local xmlns_compression_feature = "http://jabber.org/features/compress" | 12 local xmlns_compression_feature = "http://jabber.org/features/compress" |
| 12 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" | 13 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" |
| 13 local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); | 14 local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); |
| 14 | 15 |
| 15 | 16 |
| 16 module:add_event_hook("stream-features", | 17 module:add_event_hook("stream-features", |
| 17 function (session, features) | 18 function (session, features) |
| 18 features:add_child(compression_stream_feature); | 19 if not session.compressed then features:add_child(compression_stream_feature); end |
| 19 end | 20 end |
| 20 ); | 21 ); |
| 21 | 22 |
| 22 module:add_handler("c2s_unauthed", "compress", xmlns_compression_protocol, | 23 module:add_handler("c2s_unauthed", "compress", xmlns_compression_protocol, |
| 23 function(session, stanza) | 24 function(session, stanza) |
| 24 -- checking if the compression method is supported | 25 -- checking if the compression method is supported |
| 25 local method = stanza:child_with_name("method")[1]; | 26 local method = stanza:child_with_name("method")[1]; |
| 26 if method == "zlib" then | 27 if method == "zlib" then |
| 27 session.log("info", method.." compression selected."); | 28 session.log("info", method.." compression selected."); |
| 28 session.send(st.stanza("compressed", {xmlns=xmlns_compression_protocol})); | 29 session.send(st.stanza("compressed", {xmlns=xmlns_compression_protocol})); |
| 30 session:reset_stream(); | |
| 31 | |
| 32 -- create deflate and inflate streams | |
| 33 local deflate_stream = zlib.deflate(9); | |
| 34 local inflate_stream = zlib.inflate(); | |
| 35 | |
| 36 -- setup compression for session.w | |
| 37 local old_send = session.send; | |
| 38 | |
| 39 session.send = function(t) | |
| 40 local compressed, eof = deflate_stream(tostring(t), 'sync'); | |
| 41 old_send(compressed); | |
| 42 end; | |
| 43 | |
| 44 -- setup decompression for session.data | |
| 45 local function setup_decompression(session) | |
| 46 local old_data = session.data | |
| 47 session.data = function(conn, data) | |
| 48 local decompressed, eof = inflate_stream(data); | |
| 49 old_data(conn, decompressed); | |
| 50 end; | |
| 51 end | |
| 52 setup_decompression(session); | |
| 53 | |
| 54 local session_reset_stream = session.reset_stream; | |
| 55 session.reset_stream = function(session) | |
| 56 session_reset_stream(session); | |
| 57 setup_decompression(session); | |
| 58 return true; | |
| 59 end; | |
| 60 session.compressed = true; | |
| 29 else | 61 else |
| 30 session.log("info", method.." compression selected. But we don't support it."); | 62 session.log("info", method.." compression selected. But we don't support it."); |
| 31 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); | 63 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); |
| 32 session.send(error_st); | 64 session.send(error_st); |
| 33 end | 65 end |