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 zlib = require "zlib"; |
10 local print = print |
10 local print = print; |
|
11 local pcall = pcall; |
11 |
12 |
12 local xmlns_compression_feature = "http://jabber.org/features/compress" |
13 local xmlns_compression_feature = "http://jabber.org/features/compress" |
13 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" |
14 local xmlns_compression_protocol = "http://jabber.org/protocol/compress" |
14 local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); |
15 local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); |
15 |
16 |
43 session.log("info", method.." compression selected."); |
44 session.log("info", method.." compression selected."); |
44 session.send(st.stanza("compressed", {xmlns=xmlns_compression_protocol})); |
45 session.send(st.stanza("compressed", {xmlns=xmlns_compression_protocol})); |
45 session:reset_stream(); |
46 session:reset_stream(); |
46 |
47 |
47 -- create deflate and inflate streams |
48 -- create deflate and inflate streams |
48 local deflate_stream = zlib.deflate(compression_level); |
49 local status, deflate_stream = pcall(zlib.deflate, compression_level); |
49 local inflate_stream = zlib.inflate(); |
50 if status == false then |
|
51 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
|
52 session.send(error_st); |
|
53 session:log("error", "Failed to create zlib.deflate filter."); |
|
54 module:log("error", inflate_stream); |
|
55 return |
|
56 end |
|
57 |
|
58 local status, inflate_stream = pcall(zlib.inflate); |
|
59 if status == false then |
|
60 local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
|
61 session.send(error_st); |
|
62 session:log("error", "Failed to create zlib.deflate filter."); |
|
63 module:log("error", inflate_stream); |
|
64 return |
|
65 end |
50 |
66 |
51 -- setup compression for session.w |
67 -- setup compression for session.w |
52 local old_send = session.send; |
68 local old_send = session.send; |
53 |
69 |
54 session.send = function(t) |
70 session.send = function(t) |
55 local compressed, eof = deflate_stream(tostring(t), 'sync'); |
71 local status, compressed, eof = pcall(deflate_stream, tostring(t), 'sync'); |
|
72 if status == false then |
|
73 session:close({ |
|
74 condition = "undefined-condition"; |
|
75 text = compressed; |
|
76 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
|
77 }); |
|
78 module:log("error", compressed); |
|
79 return; |
|
80 end |
56 old_send(compressed); |
81 old_send(compressed); |
57 end; |
82 end; |
58 |
83 |
59 -- setup decompression for session.data |
84 -- setup decompression for session.data |
60 local function setup_decompression(session) |
85 local function setup_decompression(session) |
61 local old_data = session.data |
86 local old_data = session.data |
62 session.data = function(conn, data) |
87 session.data = function(conn, data) |
63 local decompressed, eof = inflate_stream(data); |
88 local status, decompressed, eof = pcall(inflate_stream, data); |
|
89 if status == false then |
|
90 session:close({ |
|
91 condition = "undefined-condition"; |
|
92 text = compressed; |
|
93 extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
|
94 }); |
|
95 module:log("error", compressed); |
|
96 return; |
|
97 end |
64 old_data(conn, decompressed); |
98 old_data(conn, decompressed); |
65 end; |
99 end; |
66 end |
100 end |
67 setup_decompression(session); |
101 setup_decompression(session); |
68 |
102 |