diff options
author | Matthew Wild <mwild1@gmail.com> | 2013-04-12 00:32:10 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2013-04-12 00:32:10 +0100 |
commit | 714d8c8d820069449393e1159b605ff8959d3a58 (patch) | |
tree | 8d6271d7aa6669750651b16347b61448eda8e0b6 /util/http.lua | |
parent | 3e3e95de464ba6b9c4a0b2a0086dd557c87fa90f (diff) | |
parent | 398145c10946bd93ba44f1b99fedd1d1ce85f8bc (diff) | |
download | prosody-714d8c8d820069449393e1159b605ff8959d3a58.tar.gz prosody-714d8c8d820069449393e1159b605ff8959d3a58.zip |
Merge 0.9->trunk
Diffstat (limited to 'util/http.lua')
-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; |