Software /
code /
prosody
Comparison
plugins/mod_compression.lua @ 1678:79eb903d0e67
Using pcall to make save the rest from zlib fails. Emit errors on those fails.
author | Tobias Markmann <tm@ayena.de> |
---|---|
date | Thu, 13 Aug 2009 13:20:32 +0200 |
parent | 1677:f0961ce9830c |
child | 1679:e2eb0eaf2544 |
comparison
equal
deleted
inserted
replaced
1677:f0961ce9830c | 1678:79eb903d0e67 |
---|---|
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 |