diff options
author | Waqas Hussain <waqas20@gmail.com> | 2016-03-05 17:51:35 -0500 |
---|---|---|
committer | Waqas Hussain <waqas20@gmail.com> | 2016-03-05 17:51:35 -0500 |
commit | edcf8f0c7d88528e7a16fede0406664af174683b (patch) | |
tree | 2f01313ae263ab3c47ba0a0fa42bd811b4e7c95b /util | |
parent | 9b896c90a7ffbc6986b554c2f454f70cef58a680 (diff) | |
download | prosody-edcf8f0c7d88528e7a16fede0406664af174683b.tar.gz prosody-edcf8f0c7d88528e7a16fede0406664af174683b.zip |
util.xml: Correct stanza.namespaces table construction when duplicate prefix names are encountered in the element tree.
Diffstat (limited to 'util')
-rw-r--r-- | util/xml.lua | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/util/xml.lua b/util/xml.lua index 9e12f0df..ec06fb01 100644 --- a/util/xml.lua +++ b/util/xml.lua @@ -1,6 +1,8 @@ local st = require "util.stanza"; local lxp = require "lxp"; +local t_insert = table.insert; +local t_remove = table.remove; local _ENV = nil; @@ -14,15 +16,19 @@ local parse_xml = (function() --luacheck: ignore 212/self local handler = {}; local stanza = st.stanza("root"); - local namespaces = {} + local namespaces = {}; + local prefixes = {}; function handler:StartNamespaceDecl(prefix, url) if prefix ~= nil then - namespaces[prefix] = url + t_insert(namespaces, url); + t_insert(prefixes, prefix); end end function handler:EndNamespaceDecl(prefix) if prefix ~= nil then - namespaces[prefix] = nil + -- we depend on each StartNamespaceDecl having a paired EndNamespaceDecl + t_remove(namespaces); + t_remove(prefixes); end end function handler:StartElement(tagname, attr) @@ -46,8 +52,8 @@ local parse_xml = (function() end end local n = {} - for prefix, url in pairs(namespaces) do - n[prefix] = url + for i=1,#namespaces do + n[prefixes[i]] = namespaces[i]; end stanza:tag(name, attr, n); end |