X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fxmppstream.lua;h=0a1bf7acfd24307d8e27982eefd2e2b224940a73;hb=eecf63b9e5aff94dc3d3e88e3b5dfa853d92fc1a;hp=ed5395b5b0c9f2962dddbf7244635bf57d0c388e;hpb=bca1a48421947ca7d627c23433effed81a1d91f2;p=prosody.git diff --git a/util/xmppstream.lua b/util/xmppstream.lua index ed5395b5..0a1bf7ac 100644 --- a/util/xmppstream.lua +++ b/util/xmppstream.lua @@ -14,7 +14,7 @@ local tostring = tostring; local t_insert = table.insert; local t_concat = table.concat; -local default_log = require "util.logger".init("xmlhandlers"); +local default_log = require "util.logger".init("xmppstream"); local error = error; @@ -31,6 +31,9 @@ local xmlns_streams = "http://etherx.jabber.org/streams"; local ns_separator = "\1"; local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; +_M.ns_separator = ns_separator; +_M.ns_pattern = ns_pattern; + function new_sax_handlers(session, stream_callbacks) local xml_handlers = {}; @@ -48,6 +51,7 @@ function new_sax_handlers(session, stream_callbacks) local stream_default_ns = stream_callbacks.default_ns; local chardata, stanza = {}; + local non_streamns_depth = 0; function xml_handlers:StartElement(tagname, attr) if stanza and #chardata > 0 then -- We have some character data in the buffer @@ -59,8 +63,9 @@ function new_sax_handlers(session, stream_callbacks) curr_ns, name = "", curr_ns; end - if curr_ns ~= stream_default_ns then + if curr_ns ~= stream_default_ns or non_streamns_depth > 0 then attr.xmlns = curr_ns; + non_streamns_depth = non_streamns_depth + 1; end -- FIXME !!!!! @@ -69,8 +74,8 @@ function new_sax_handlers(session, stream_callbacks) attr[i] = nil; local ns, nm = k:match(ns_pattern); if nm ~= "" then - ns = ns_prefixes[ns]; - if ns then + ns = ns_prefixes[ns]; + if ns then attr[ns..":"..nm] = attr[k]; attr[k] = nil; end @@ -80,6 +85,7 @@ function new_sax_handlers(session, stream_callbacks) if not stanza then --if we are not currently inside a stanza if session.notopen then if tagname == stream_tag then + non_streamns_depth = 0; if cb_streamopened then cb_streamopened(session, attr); end @@ -95,10 +101,6 @@ function new_sax_handlers(session, stream_callbacks) stanza = st.stanza(name, attr); else -- we are inside a stanza, so add a tag - attr.xmlns = nil; - if curr_ns ~= stream_default_ns then - attr.xmlns = curr_ns; - end stanza:tag(name, attr); end end @@ -108,6 +110,9 @@ function new_sax_handlers(session, stream_callbacks) end end function xml_handlers:EndElement(tagname) + if non_streamns_depth > 0 then + non_streamns_depth = non_streamns_depth - 1; + end if stanza then if #chardata > 0 then -- We have some character data in the buffer @@ -115,7 +120,8 @@ function new_sax_handlers(session, stream_callbacks) chardata = {}; end -- Complete stanza - if #stanza.last_add == 0 then + local last_add = stanza.last_add; + if not last_add or #last_add == 0 then if tagname ~= stream_error_tag then cb_handlestanza(session, stanza); else @@ -145,7 +151,12 @@ function new_sax_handlers(session, stream_callbacks) stanza, chardata = nil, {}; end - return xml_handlers, { reset = reset }; + local function set_session(stream, new_session) + session = new_session; + log = new_session.log or default_log; + end + + return xml_handlers, { reset = reset, set_session = set_session }; end function new(session, stream_callbacks) @@ -161,7 +172,8 @@ function new(session, stream_callbacks) end, feed = function (self, data) return parse(parser, data); - end + end, + set_session = meta.set_session; }; end