Netrequire Server

Catalogue > urlcode.lua

Module for parsing URL encoded GET/POST sequences.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
-- $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