diff options
author | Matthew Wild <mwild1@gmail.com> | 2013-04-11 17:32:59 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2013-04-11 17:32:59 +0100 |
commit | bbf4d75f418176c8deb9f6bf75258160e0aaf229 (patch) | |
tree | e8ae2c69d0325743993d43e3b2c81d7eb77bbfda /util | |
parent | 95bc304291d365a1e1092607ffd7f19b1441eb4a (diff) | |
download | prosody-bbf4d75f418176c8deb9f6bf75258160e0aaf229.tar.gz prosody-bbf4d75f418176c8deb9f6bf75258160e0aaf229.zip |
net.http, util.http: Move definitions of urlencode/decode and formencode/decode to util.http (possible to use them without unnecessary network-related dependencies)
Diffstat (limited to 'util')
-rw-r--r-- | util/http.lua | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/util/http.lua b/util/http.lua index 5b49d1d0..5dd636d9 100644 --- a/util/http.lua +++ b/util/http.lua @@ -7,9 +7,54 @@ local http = {}; +function http.urlencode(s) + return s and (s:gsub("[^a-zA-Z0-9.~_-]", function (c) return format("%%%02x", c:byte()); end)); +end +function http.urldecode(s) + return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end)); +end + +local function _formencodepart(s) + return s and (s:gsub("%W", function (c) + if c ~= " " then + return format("%%%02x", c:byte()); + else + return "+"; + end + end)); +end + +function http.formencode(form) + local result = {}; + if form[1] then -- Array of ordered { name, value } + for _, field in ipairs(form) do + t_insert(result, _formencodepart(field.name).."=".._formencodepart(field.value)); + end + else -- Unordered map of name -> value + for name, value in pairs(form) do + t_insert(result, _formencodepart(name).."=".._formencodepart(value)); + end + end + return t_concat(result, "&"); +end + +function http.formdecode(s) + if not s:match("=") then return urldecode(s); end + local r = {}; + for k, v in s:gmatch("([^=&]*)=([^&]*)") do + k, v = k:gsub("%+", "%%20"), v:gsub("%+", "%%20"); + k, v = urldecode(k), urldecode(v); + t_insert(r, { name = k, value = v }); + r[k] = v; + end + return r; +end + function http.contains_token(field, token) field = ","..field:gsub("[ \t]", ""):lower()..","; return field:find(","..token:lower()..",", 1, true) ~= nil; end + + return http; |