-- {"ver":"1.0.0","author":"TechnoJo4"} local gsub, format, byte, char = string.gsub, string.format, string.byte, string.char ---@return string ---@param str string local function urlDecode(str) if str == nil or str == "" then return "" end str = gsub(str, '+', ' ') str = gsub(str, '%%(%x%x)', function(h) return char(tonumber(h, 16)) end) str = gsub(str, '\r\n', '\n') return str end local encode_tbl = {["_"] = true, ["-"] = true, ["~"] = true, ["."] = true} for b=byte('a'),byte('z') do encode_tbl[char(b)] = true end for b=byte('A'),byte('Z') do encode_tbl[char(b)] = true end for b=byte('0'),byte('9') do encode_tbl[char(b)] = true end ---@return string ---@param str string local function urlEncode(str) if str == nil or str == "" then return "" end if str then str = gsub(str, '\n', '\r\n') str = gsub(str, '(.)', function(c) if encode_tbl[c] then return c else return format('%%%02X', byte(c)) end end) end return str end --- Makes a query string from a table. ---@return string ---@param tbl table ---@param url string | nil local function querystring(tbl, url) local fields = {} for key, value in pairs(tbl) do local keyString = urlEncode(tostring(key)) .. "=" if type(value) == "table" then for _, v in ipairs(value) do table.insert(fields, keyString .. urlEncode(tostring(v))) end else table.insert(fields, keyString .. urlEncode(tostring(value))) end end return (url and url .. "?" or "") .. table.concat(fields, "&") end return { decode = urlDecode, encode = urlEncode, querystring = querystring, }