tests: Add basic test for net.http.parser
[prosody.git] / util / jid.lua
index 0d9a864fa3b1d8a4faa5e747a96c30a1c47e20a9..522fb126747439aea5add0853db74f35643fc014 100644 (file)
@@ -8,7 +8,8 @@
 
 
 
-local match = string.match;
+local select = select;
+local match, sub = string.match, string.sub;
 local nodeprep = require "util.encodings".stringprep.nodeprep;
 local nameprep = require "util.encodings".stringprep.nameprep;
 local resourceprep = require "util.encodings".stringprep.resourceprep;
@@ -23,9 +24,9 @@ local escapes = {
 local unescapes = {};
 for k,v in pairs(escapes) do unescapes[v] = k; end
 
-module "jid"
+local _ENV = nil;
 
-local function _split(jid)
+local function split(jid)
        if not jid then return; end
        local node, nodepos = match(jid, "^([^@/]+)@()");
        local host, hostpos = match(jid, "^([^@/]+)()", nodepos)
@@ -34,19 +35,21 @@ local function _split(jid)
        if (not host) or ((not resource) and #jid >= hostpos) then return nil, nil, nil; end
        return node, host, resource;
 end
-split = _split;
 
-function bare(jid)
-       local node, host = _split(jid);
+local function bare(jid)
+       local node, host = split(jid);
        if node and host then
                return node.."@"..host;
        end
        return host;
 end
 
-local function _prepped_split(jid)
-       local node, host, resource = _split(jid);
+local function prepped_split(jid)
+       local node, host, resource = split(jid);
        if host then
+               if sub(host, -1, -1) == "." then -- Strip empty root label
+                       host = sub(host, 1, -2);
+               end
                host = nameprep(host);
                if not host then return; end
                if node then
@@ -60,39 +63,29 @@ local function _prepped_split(jid)
                return node, host, resource;
        end
 end
-prepped_split = _prepped_split;
-
-function prep(jid)
-       local node, host, resource = _prepped_split(jid);
-       if host then
-               if node then
-                       host = node .. "@" .. host;
-               end
-               if resource then
-                       host = host .. "/" .. resource;
-               end
-       end
-       return host;
-end
 
-function join(node, host, resource)
-       if node and host and resource then
+local function join(node, host, resource)
+       if not host then return end
+       if node and resource then
                return node.."@"..host.."/"..resource;
-       elseif node and host then
+       elseif node then
                return node.."@"..host;
-       elseif host and resource then
+       elseif resource then
                return host.."/"..resource;
-       elseif host then
-               return host;
        end
-       return nil; -- Invalid JID
+       return host;
+end
+
+local function prep(jid)
+       local node, host, resource = prepped_split(jid);
+       return join(node, host, resource);
 end
 
-function compare(jid, acl)
+local function compare(jid, acl)
        -- compare jid to single acl rule
        -- TODO compare to table of rules?
-       local jid_node, jid_host, jid_resource = _split(jid);
-       local acl_node, acl_host, acl_resource = _split(acl);
+       local jid_node, jid_host, jid_resource = split(jid);
+       local acl_node, acl_host, acl_resource = split(acl);
        if ((acl_node ~= nil and acl_node == jid_node) or acl_node == nil) and
                ((acl_host ~= nil and acl_host == jid_host) or acl_host == nil) and
                ((acl_resource ~= nil and acl_resource == jid_resource) or acl_resource == nil) then
@@ -101,7 +94,31 @@ function compare(jid, acl)
        return false
 end
 
-function escape(s) return s and (s:gsub(".", escapes)); end
-function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end
+local function node(jid)
+       return (select(1, split(jid)));
+end
+
+local function host(jid)
+       return (select(2, split(jid)));
+end
+
+local function resource(jid)
+       return (select(3, split(jid)));
+end
 
-return _M;
+local function escape(s) return s and (s:gsub(".", escapes)); end
+local function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end
+
+return {
+       split = split;
+       bare = bare;
+       prepped_split = prepped_split;
+       join = join;
+       prep = prep;
+       compare = compare;
+       node = node;
+       host = host;
+       resource = resource;
+       escape = escape;
+       unescape = unescape;
+};