Sun, 14 Feb 2010 20:47:09 +0000
net.server_event: Fire onincoming() callback for new connections as opposed to the new onconnect() - let's change this for a future version though
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
1 | -- Prosody IM |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
2 | -- Copyright (C) 2009 Tobias Markmann |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
3 | -- |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
4 | -- This project is MIT/X11 licensed. Please see the |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
5 | -- COPYING file in the source package for more information. |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
6 | -- |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
7 | |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
8 | local st = require "util.stanza"; |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
9 | local zlib = require "zlib"; |
1678
79eb903d0e67
Using pcall to make save the rest from zlib fails. Emit errors on those fails.
Tobias Markmann <tm@ayena.de>
parents:
1677
diff
changeset
|
10 | local pcall = pcall; |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
11 | local xmlns_compression_feature = "http://jabber.org/features/compress" |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
12 | local xmlns_compression_protocol = "http://jabber.org/protocol/compress" |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
13 | local xmlns_stream = "http://etherx.jabber.org/streams"; |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
14 | local compression_stream_feature = st.stanza("compression", {xmlns=xmlns_compression_feature}):tag("method"):text("zlib"):up(); |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
15 | |
1676 | 16 | local compression_level = module:get_option("compression_level"); |
17 | -- if not defined assume admin wants best compression | |
18 | if compression_level == nil then compression_level = 9 end; | |
19 | ||
2277 | 20 | |
1676 | 21 | compression_level = tonumber(compression_level); |
22 | if not compression_level or compression_level < 1 or compression_level > 9 then | |
23 | module:log("warn", "Invalid compression level in config: %s", tostring(compression_level)); | |
24 | module:log("warn", "Module loading aborted. Compression won't be available."); | |
25 | return; | |
26 | end | |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
27 | |
2609
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
28 | module:hook("stream-features", function(event) |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
29 | local origin, features = event.origin, event.features; |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
30 | if not origin.compressed then |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
31 | -- FIXME only advertise compression support when TLS layer has no compression enabled |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
32 | features:add_child(compression_stream_feature); |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
33 | end |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
34 | end); |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
35 | |
2609
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
36 | module:hook("s2s-stream-features", function(event) |
2613
afa20941e098
s2smanager, mod_compression, mod_tls: Changed event.session to event.origin for s2s-stream-features event for consistency.
Waqas Hussain <waqas20@gmail.com>
parents:
2609
diff
changeset
|
37 | local origin, features = event.origin, event.features; |
2609
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
38 | -- FIXME only advertise compression support when TLS layer has no compression enabled |
2613
afa20941e098
s2smanager, mod_compression, mod_tls: Changed event.session to event.origin for s2s-stream-features event for consistency.
Waqas Hussain <waqas20@gmail.com>
parents:
2609
diff
changeset
|
39 | if not origin.compressed then |
2609
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
40 | features:add_child(compression_stream_feature); |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
41 | end |
2ee28cae530a
mod_compression: Hook stream-features event using new events API.
Waqas Hussain <waqas20@gmail.com>
parents:
2324
diff
changeset
|
42 | end); |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
43 | |
2289
c6bed51c6733
mod_compression: Some comment clean up.
Tobias Markmann <tm@ayena.de>
parents:
2287
diff
changeset
|
44 | -- Hook to activate compression if remote server supports it. |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
45 | module:hook_stanza(xmlns_stream, "features", |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
46 | function (session, stanza) |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
47 | if not session.compressed then |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
48 | -- does remote server support compression? |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
49 | local comp_st = stanza:child_with_name("compression"); |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
50 | if comp_st then |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
51 | -- do we support the mechanism |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
52 | for a in comp_st:children() do |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
53 | local algorithm = a[1] |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
54 | if algorithm == "zlib" then |
2280
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
55 | session.sends2s(st.stanza("compress", {xmlns=xmlns_compression_protocol}):tag("method"):text("zlib")) |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
56 | session.log("info", "Enabled compression using zlib.") |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
57 | return true; |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
58 | end |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
59 | end |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
60 | session.log("debug", "Remote server supports no compression algorithm we support.") |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
61 | end |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
62 | end |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
63 | end |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
64 | , 250); |
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
65 | |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
66 | |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
67 | -- returns either nil or a fully functional ready to use inflate stream |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
68 | local function get_deflate_stream(session) |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
69 | local status, deflate_stream = pcall(zlib.deflate, compression_level); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
70 | if status == false then |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
71 | local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
72 | (session.sends2s or session.send)(error_st); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
73 | session.log("error", "Failed to create zlib.deflate filter."); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
74 | module:log("error", deflate_stream); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
75 | return |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
76 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
77 | return deflate_stream |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
78 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
79 | |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
80 | -- returns either nil or a fully functional ready to use inflate stream |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
81 | local function get_inflate_stream(session) |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
82 | local status, inflate_stream = pcall(zlib.inflate); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
83 | if status == false then |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
84 | local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("setup-failed"); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
85 | (session.sends2s or session.send)(error_st); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
86 | session.log("error", "Failed to create zlib.deflate filter."); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
87 | module:log("error", inflate_stream); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
88 | return |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
89 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
90 | return inflate_stream |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
91 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
92 | |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
93 | -- setup compression for a stream |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
94 | local function setup_compression(session, deflate_stream) |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
95 | local old_send = (session.sends2s or session.send); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
96 | |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
97 | local new_send = function(t) |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
98 | --TODO: Better code injection in the sending process |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
99 | session.log(t) |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
100 | local status, compressed, eof = pcall(deflate_stream, tostring(t), 'sync'); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
101 | if status == false then |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
102 | session:close({ |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
103 | condition = "undefined-condition"; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
104 | text = compressed; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
105 | extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
106 | }); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
107 | module:log("warn", compressed); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
108 | return; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
109 | end |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
110 | session.conn:write(compressed); |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
111 | end; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
112 | |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
113 | if session.sends2s then session.sends2s = new_send |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
114 | elseif session.send then session.send = new_send end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
115 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
116 | |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
117 | -- setup decompression for a stream |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
118 | local function setup_decompression(session, inflate_stream) |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
119 | local old_data = session.data |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
120 | session.data = function(conn, data) |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
121 | local status, decompressed, eof = pcall(inflate_stream, data); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
122 | if status == false then |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
123 | session:close({ |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
124 | condition = "undefined-condition"; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
125 | text = decompressed; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
126 | extra = st.stanza("failure", {xmlns="http://jabber.org/protocol/compress"}):tag("processing-failed"); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
127 | }); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
128 | module:log("warn", decompressed); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
129 | return; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
130 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
131 | old_data(conn, decompressed); |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
132 | end; |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
133 | end |
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
134 | |
2280
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
135 | module:add_handler({"s2sout_unauthed", "s2sout"}, "compressed", xmlns_compression_protocol, |
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
136 | function(session ,stanza) |
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
137 | session.log("debug", "Activating compression...") |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
138 | -- create deflate and inflate streams |
2290
9c5941198719
mod_compression: Declaring the de-/compression pipes as local.
Tobias Markmann <tm@ayena.de>
parents:
2289
diff
changeset
|
139 | local deflate_stream = get_deflate_stream(session); |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
140 | if not deflate_stream then return end |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
141 | |
2290
9c5941198719
mod_compression: Declaring the de-/compression pipes as local.
Tobias Markmann <tm@ayena.de>
parents:
2289
diff
changeset
|
142 | local inflate_stream = get_inflate_stream(session); |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
143 | if not inflate_stream then return end |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
144 | |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
145 | -- setup compression for session.w |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
146 | setup_compression(session, deflate_stream); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
147 | |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
148 | -- setup decompression for session.data |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
149 | setup_decompression(session, inflate_stream); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
150 | local session_reset_stream = session.reset_stream; |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
151 | session.reset_stream = function(session) |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
152 | session_reset_stream(session); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
153 | setup_decompression(session, inflate_stream); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
154 | return true; |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
155 | end; |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
156 | session:reset_stream(); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
157 | local default_stream_attr = {xmlns = "jabber:server", ["xmlns:stream"] = "http://etherx.jabber.org/streams", |
2286
3c17fc919f7b
mod_compression: Define db (dialback) namespace in stream header.
Tobias Markmann <tm@ayena.de>
parents:
2284
diff
changeset
|
158 | ["xmlns:db"] = 'jabber:server:dialback', version = "1.0", to = session.to_host, from = session.from_host}; |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
159 | session.sends2s("<?xml version='1.0'?>"); |
2291
abd28ed5d8b0
mod_compression: Removing trailing whitespace.
Tobias Markmann <tm@ayena.de>
parents:
2290
diff
changeset
|
160 | session.sends2s(st.stanza("stream:stream", default_stream_attr):top_tag()); |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
161 | session.compressed = true; |
2280
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
162 | end |
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
163 | ); |
6f54dac3ec2d
mod_compression: Prepare activating of compression on s2s.
Tobias Markmann <tm@ayena.de>
parents:
2278
diff
changeset
|
164 | |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
165 | module:add_handler({"c2s_unauthed", "c2s", "s2sin_unauthed", "s2sin"}, "compress", xmlns_compression_protocol, |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
166 | function(session, stanza) |
1719
cf103398e643
Don't allow double compression.
Tobias Markmann <tm@ayena.de>
parents:
1718
diff
changeset
|
167 | -- fail if we are already compressed |
cf103398e643
Don't allow double compression.
Tobias Markmann <tm@ayena.de>
parents:
1718
diff
changeset
|
168 | if session.compressed then |
cf103398e643
Don't allow double compression.
Tobias Markmann <tm@ayena.de>
parents:
1718
diff
changeset
|
169 | local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
170 | (session.sends2s or session.send)(error_st); |
2277 | 171 | session.log("warn", "Tried to establish another compression layer."); |
1719
cf103398e643
Don't allow double compression.
Tobias Markmann <tm@ayena.de>
parents:
1718
diff
changeset
|
172 | end |
cf103398e643
Don't allow double compression.
Tobias Markmann <tm@ayena.de>
parents:
1718
diff
changeset
|
173 | |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
174 | -- checking if the compression method is supported |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
175 | local method = stanza:child_with_name("method")[1]; |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
176 | if method == "zlib" then |
2324
9f7eb1054a2f
mod_compression: Tweak some log levels
Matthew Wild <mwild1@gmail.com>
parents:
2291
diff
changeset
|
177 | session.log("debug", method.." compression selected."); |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
178 | |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
179 | -- create deflate and inflate streams |
2290
9c5941198719
mod_compression: Declaring the de-/compression pipes as local.
Tobias Markmann <tm@ayena.de>
parents:
2289
diff
changeset
|
180 | local deflate_stream = get_deflate_stream(session); |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
181 | if not deflate_stream then return end |
1678
79eb903d0e67
Using pcall to make save the rest from zlib fails. Emit errors on those fails.
Tobias Markmann <tm@ayena.de>
parents:
1677
diff
changeset
|
182 | |
2290
9c5941198719
mod_compression: Declaring the de-/compression pipes as local.
Tobias Markmann <tm@ayena.de>
parents:
2289
diff
changeset
|
183 | local inflate_stream = get_inflate_stream(session); |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
184 | if not inflate_stream then return end |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
185 | |
2284
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
186 | (session.sends2s or session.send)(st.stanza("compressed", {xmlns=xmlns_compression_protocol})); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
187 | session:reset_stream(); |
e0b2d934f316
mod_compression: Enabeling compression for outgoing s2s streams.
Tobias Markmann <tm@ayena.de>
parents:
2283
diff
changeset
|
188 | |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
189 | -- setup compression for session.w |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
190 | setup_compression(session, deflate_stream); |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
191 | |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
192 | -- setup decompression for session.data |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
193 | setup_decompression(session, inflate_stream); |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
194 | |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
195 | local session_reset_stream = session.reset_stream; |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
196 | session.reset_stream = function(session) |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
197 | session_reset_stream(session); |
2283
3dd7fdee9035
mod_compression: Some further refactoring.
Tobias Markmann <tm@ayena.de>
parents:
2282
diff
changeset
|
198 | setup_decompression(session, inflate_stream); |
1671
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
199 | return true; |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
200 | end; |
d196ac213104
Actually inject de- and compression into the reading/writing functions.
Tobias Markmann <tm@ayena.de>
parents:
1670
diff
changeset
|
201 | session.compressed = true; |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
202 | else |
2324
9f7eb1054a2f
mod_compression: Tweak some log levels
Matthew Wild <mwild1@gmail.com>
parents:
2291
diff
changeset
|
203 | session.log("warn", method.." compression selected. But we don't support it."); |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
204 | local error_st = st.stanza("failure", {xmlns=xmlns_compression_protocol}):tag("unsupported-method"); |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
205 | (session.sends2s or session.send)(error_st); |
1669
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
206 | end |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
207 | end |
b8eec163a823
Commit initial version of mod_compression.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
208 | ); |
2278
0b0fe49e5251
Enable one way stream compression on s2s links.
Tobias Markmann <tm@ayena.de>
parents:
2277
diff
changeset
|
209 |