util/http.lua
changeset 5471 34bfd26525f5
parent 5458 84162b81c863
child 9507 cfbea3064aa9
equal deleted inserted replaced
5470:a62c1d4ec4ab 5471:34bfd26525f5
     3 --
     3 --
     4 -- This project is MIT/X11 licensed. Please see the
     4 -- This project is MIT/X11 licensed. Please see the
     5 -- COPYING file in the source package for more information.
     5 -- COPYING file in the source package for more information.
     6 --
     6 --
     7 
     7 
     8 local http = {};
     8 local format, char = string.format, string.char;
       
     9 local pairs, ipairs, tonumber = pairs, ipairs, tonumber;
       
    10 local t_insert, t_concat = table.insert, table.concat;
     9 
    11 
    10 function http.urlencode(s)
    12 local function urlencode(s)
    11 	return s and (s:gsub("[^a-zA-Z0-9.~_-]", function (c) return format("%%%02x", c:byte()); end));
    13 	return s and (s:gsub("[^a-zA-Z0-9.~_-]", function (c) return format("%%%02x", c:byte()); end));
    12 end
    14 end
    13 function http.urldecode(s)
    15 local function urldecode(s)
    14 	return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end));
    16 	return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end));
    15 end
    17 end
    16 
    18 
    17 local function _formencodepart(s)
    19 local function _formencodepart(s)
    18 	return s and (s:gsub("%W", function (c)
    20 	return s and (s:gsub("%W", function (c)
    22 			return "+";
    24 			return "+";
    23 		end
    25 		end
    24 	end));
    26 	end));
    25 end
    27 end
    26 
    28 
    27 function http.formencode(form)
    29 local function formencode(form)
    28 	local result = {};
    30 	local result = {};
    29 	if form[1] then -- Array of ordered { name, value }
    31 	if form[1] then -- Array of ordered { name, value }
    30 		for _, field in ipairs(form) do
    32 		for _, field in ipairs(form) do
    31 			t_insert(result, _formencodepart(field.name).."=".._formencodepart(field.value));
    33 			t_insert(result, _formencodepart(field.name).."=".._formencodepart(field.value));
    32 		end
    34 		end
    36 		end
    38 		end
    37 	end
    39 	end
    38 	return t_concat(result, "&");
    40 	return t_concat(result, "&");
    39 end
    41 end
    40 
    42 
    41 function http.formdecode(s)
    43 local function formdecode(s)
    42 	if not s:match("=") then return urldecode(s); end
    44 	if not s:match("=") then return urldecode(s); end
    43 	local r = {};
    45 	local r = {};
    44 	for k, v in s:gmatch("([^=&]*)=([^&]*)") do
    46 	for k, v in s:gmatch("([^=&]*)=([^&]*)") do
    45 		k, v = k:gsub("%+", "%%20"), v:gsub("%+", "%%20");
    47 		k, v = k:gsub("%+", "%%20"), v:gsub("%+", "%%20");
    46 		k, v = urldecode(k), urldecode(v);
    48 		k, v = urldecode(k), urldecode(v);
    48 		r[k] = v;
    50 		r[k] = v;
    49 	end
    51 	end
    50 	return r;
    52 	return r;
    51 end
    53 end
    52 
    54 
    53 function http.contains_token(field, token)
    55 local function contains_token(field, token)
    54 	field = ","..field:gsub("[ \t]", ""):lower()..",";
    56 	field = ","..field:gsub("[ \t]", ""):lower()..",";
    55 	return field:find(","..token:lower()..",", 1, true) ~= nil;
    57 	return field:find(","..token:lower()..",", 1, true) ~= nil;
    56 end
    58 end
    57 
    59 
    58 
    60 return {
    59 
    61 	urlencode = urlencode, urldecode = urldecode;
    60 return http;
    62 	formencode = formencode, formdecode = formdecode;
       
    63 	contains_token = contains_token;
       
    64 };