core/xmlhandlers.lua

branch
s2s
changeset 148
4c0dcd245d34
parent 146
3826ca244eb6
child 150
d09b8a1ab046
equal deleted inserted replaced
147:ccebb2720741 148:4c0dcd245d34
1 1
2 require "util.stanza" 2 require "util.stanza"
3 3
4 local st = stanza; 4 local st = stanza;
5 local tostring = tostring; 5 local tostring = tostring;
6 local pairs = pairs;
7 local ipairs = ipairs;
8 local type = type;
9 local print = print;
6 local format = string.format; 10 local format = string.format;
7 local m_random = math.random; 11 local m_random = math.random;
8 local t_insert = table.insert; 12 local t_insert = table.insert;
9 local t_remove = table.remove; 13 local t_remove = table.remove;
10 local t_concat = table.concat; 14 local t_concat = table.concat;
15 19
16 local error = error; 20 local error = error;
17 21
18 module "xmlhandlers" 22 module "xmlhandlers"
19 23
24 local ns_prefixes = {
25 ["http://www.w3.org/XML/1998/namespace"] = "xml";
26 }
27
20 function init_xmlhandlers(session, streamopened) 28 function init_xmlhandlers(session, streamopened)
21 local ns_stack = { "" }; 29 local ns_stack = { "" };
22 local curr_ns = ""; 30 local curr_ns = "";
23 local curr_tag; 31 local curr_tag;
24 local chardata = {}; 32 local chardata = {};
25 local xml_handlers = {}; 33 local xml_handlers = {};
26 local log = session.log or default_log; 34 local log = session.log or default_log;
27 local print = function (...) log("info", "xmlhandlers", t_concatall({...}, "\t")); end 35 --local print = function (...) log("info", "xmlhandlers", t_concatall({...}, "\t")); end
28 36
29 local send = session.send; 37 local send = session.send;
30 38
31 local stanza 39 local stanza
32 function xml_handlers:StartElement(name, attr) 40 function xml_handlers:StartElement(name, attr)
33 if stanza and #chardata > 0 then 41 if stanza and #chardata > 0 then
34 -- We have some character data in the buffer 42 -- We have some character data in the buffer
35 stanza:text(t_concat(chardata)); 43 stanza:text(t_concat(chardata));
36 chardata = {}; 44 chardata = {};
37 end 45 end
38 curr_ns,name = name:match("^(.+):([%w%-]+)$"); 46 curr_ns,name = name:match("^(.+)|([%w%-]+)$");
39 attr.xmlns = curr_ns; 47 if curr_ns ~= "jabber:server" then
48 attr.xmlns = curr_ns;
49 end
50
51 -- FIXME !!!!!
52 for i, k in ipairs(attr) do
53 if type(k) == "string" then
54 local ns, nm = k:match("^([^|]+)|?([^|]-)$")
55 if ns and nm then
56 ns = ns_prefixes[ns];
57 if ns then
58 attr[ns..":"..nm] = attr[k];
59 attr[i] = ns..":"..nm;
60 attr[k] = nil;
61 end
62 end
63 end
64 end
40 65
41 if not stanza then --if we are not currently inside a stanza 66 if not stanza then --if we are not currently inside a stanza
42 if session.notopen then 67 if session.notopen then
43 if name == "stream" then 68 if name == "stream" then
44 streamopened(session, attr); 69 streamopened(session, attr);
51 end 76 end
52 77
53 stanza = st.stanza(name, attr); --{ to = attr.to, type = attr.type, id = attr.id, xmlns = curr_ns }); 78 stanza = st.stanza(name, attr); --{ to = attr.to, type = attr.type, id = attr.id, xmlns = curr_ns });
54 curr_tag = stanza; 79 curr_tag = stanza;
55 else -- we are inside a stanza, so add a tag 80 else -- we are inside a stanza, so add a tag
56 attr.xmlns = curr_ns; 81 attr.xmlns = nil;
82 if curr_ns ~= "jabber:server" and curr_ns ~= "jabber:client" then
83 attr.xmlns = curr_ns;
84 end
57 stanza:tag(name, attr); 85 stanza:tag(name, attr);
58 end 86 end
59 end 87 end
60 function xml_handlers:CharacterData(data) 88 function xml_handlers:CharacterData(data)
61 if stanza then 89 if stanza then
62 t_insert(chardata, data); 90 t_insert(chardata, data);
63 end 91 end
64 end 92 end
65 function xml_handlers:EndElement(name) 93 function xml_handlers:EndElement(name)
66 curr_ns,name = name:match("^(.+):([%w%-]+)$"); 94 curr_ns,name = name:match("^(.+)|([%w%-]+)$");
67 if (not stanza) or #stanza.last_add < 0 or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then 95 if (not stanza) or #stanza.last_add < 0 or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then
68 if name == "stream" then 96 if name == "stream" then
69 log("debug", "Stream closed"); 97 log("debug", "Stream closed");
70 sm_destroy_session(session); 98 sm_destroy_session(session);
71 return; 99 return;

mercurial