comparison mod_addressing/mod_addressing.lua @ 935:f66a08f208ad

mod_addressing: Optimization
author Kim Alvefur <zash@zash.se>
date Mon, 25 Mar 2013 00:43:30 +0100
parents 442f88b49d9b
children
comparison
equal deleted inserted replaced
934:15e2c4fd26a0 935:f66a08f208ad
2 -- server disco features 2 -- server disco features
3 3
4 local xmlns_address = 'http://jabber.org/protocol/address'; 4 local xmlns_address = 'http://jabber.org/protocol/address';
5 5
6 local function handle_extended_addressing(data) 6 local function handle_extended_addressing(data)
7 local origin, stanza = data.origin, data.stanza; 7 local stanza = data.stanza;
8 if stanza.attr.type == "error" then 8 if stanza.attr.type == "error" then
9 return -- so we don't process bounces 9 return -- so we don't process bounces
10 end 10 end
11 local orig_to = stanza.attr.to; 11 local orig_to = stanza.attr.to;
12 local addresses = stanza:get_child("addresses", xmlns_address); 12 local addresses = stanza:get_child("addresses", xmlns_address);
16 addresses:maptags(function(address) 16 addresses:maptags(function(address)
17 if address.attr.xmlns == xmlns_address and address.name == "address" then 17 if address.attr.xmlns == xmlns_address and address.name == "address" then
18 local type, jid, delivered = address.attr.type, address.attr.jid, address.attr.delivered; 18 local type, jid, delivered = address.attr.type, address.attr.jid, address.attr.delivered;
19 if (type == "cc" or type == "bcc" or type == "to") 19 if (type == "cc" or type == "bcc" or type == "to")
20 and jid and not delivered then 20 and jid and not delivered then
21 table.insert(destinations, jid) 21 destinations[#destinations+1] = jid;
22 module:log("debug", "%s to %s", type, jid) 22 module:log("debug", "%s to %s", type, jid)
23 if type == "to" or type == "cc" then 23 if type == "to" or type == "cc" then
24 address.attr.delivered = "true"; 24 address.attr.delivered = "true";
25 return address; 25 return address;
26 elseif type == "bcc" then 26 elseif type == "bcc" then
28 end 28 end
29 end 29 end
30 end 30 end
31 return address; -- unsupported stuff goes right back 31 return address; -- unsupported stuff goes right back
32 end); 32 end);
33 for _, destination in ipairs(destinations) do 33 for i=1,#destinations do
34 stanza.attr.to = destination; 34 stanza.attr.to = destinations[i];
35 module:log("debug", "posting stanza to %s", destination) 35 module:log("debug", "posting stanza to %s", destinations[i])
36 module:send(stanza); 36 module:send(stanza);
37 end 37 end
38 stanza.attr.to = orig_to; 38 stanza.attr.to = orig_to;
39 return stanza.attr.to == module.host or nil; 39 return stanza.attr.to == module.host or nil;
40 end 40 end