urlcode.lua
Verified
Added by iNTERFACEWARE
A module for parsing URL encoded GET/POST sequences
Source Code
-- $Revision: 1.4 $ -- $Date: 2014-02-09 15:30:26 $ -- $.Path: lua_urlcode $ -- http://keplerproject.github.com/cgilua/index.html#download ---------------------------------------------------------------------------- -- Utility functions for encoding/decoding of URLs. -- -- release $Id: urlcode.lua,v 1.10 2008/01/21 16:11:32 carregal Exp ---------------------------------------------------------------------------- local ipairs, next, pairs, tonumber, type = ipairs, next, pairs, tonumber, type local string = string local table = table module ("urlcode") ---------------------------------------------------------------------------- -- Decode an URL-encoded string (see RFC 2396) ---------------------------------------------------------------------------- function unescape (str) str = string.gsub (str, "+", " ") str = string.gsub (str, "%%(%x%x)", function(h) return string.char(tonumber(h,16)) end) return str end ---------------------------------------------------------------------------- -- URL-encode a string (see RFC 2396) ---------------------------------------------------------------------------- function escape (str) str = string.gsub (str, "([^0-9a-zA-Z !'()*._~-])", -- locale independent function (c) return string.format ("%%%02X", string.byte(c)) end) str = string.gsub (str, " ", "+") return str end ---------------------------------------------------------------------------- -- Insert a (name=value) pair into table [[args]] -- @param args Table to receive the result. -- @param name Key for the table. -- @param value Value for the key. -- Multi-valued names will be represented as tables with numerical indexes -- (in the order they came). ---------------------------------------------------------------------------- function insertfield (args, name, value) if not args[name] then args[name] = value else local t = type (args[name]) if t == "string" then args[name] = {args[name],value,} elseif t == "table" then table.insert (args[name], value) else error ("CGILua fatal error (invalid args table)!") end end end ---------------------------------------------------------------------------- -- Parse url-encoded request data -- (the query part of the script URL or url-encoded post data) -- -- Each decoded (name=value) pair is inserted into table [[args]] -- @param query String to be parsed. -- @param args Table where to store the pairs. ---------------------------------------------------------------------------- function parseQuery(Query, Args) if type(Query) == "string" then local insertfield, unescape = insertfield, unescape string.gsub (Query, "([^&=]+)=([^&=]*)&?", function (key, val) insertfield (Args, unescape(key), unescape(val)) end) end end ---------------------------------------------------------------------------- -- URL-encode the elements of a table creating a string to be used in a -- URL for passing data/parameters to another script -- @param args Table where to extract the pairs (name=value). -- @return String with the resulting encoding. ---------------------------------------------------------------------------- function encodeTable(Args) if Args == nil or next(Args) == nil then -- no args or empty args? return "" end local strp = "" for key, vals in pairs(Args) do if type(vals) ~= "table" then vals = {vals} end for i,val in ipairs(vals) do strp = strp.."&"..key.."="..escape(val) end end -- remove first & return string.sub(strp,2) end
Description
A module for parsing URL encoded GET/POST sequences
Usage Details
This module contains utility functions for encoding and decoding URLs. The most useful function is urlcode.parseQuery()
that you can use parse GET/POST data into a Lua table.
How to use urlcode.lua:
- Add it to your shared modules in any Translator project
- Make sure to
require 'urlcode'
at the top of your script - Call the
urlcode.parseQuery()
method to parse GET/POST arguments - Read the comments in the code for information about other module functions
Here is some example code and sample data:
require 'urlcode' function main(Data) local Args = {} urlcode.parseQuery(Data, Args) trace(Args.FirstName) end
Sample data: “LastName=Smith&FirstName=John&Dob=19722011”