net.http: Add http.formencode() for www-form-urlencoded from an array of fields (thanks dersd)
authorMatthew Wild <mwild1@gmail.com>
Fri, 27 Aug 2010 18:33:45 +0100
changeset 3470 0e59b5cdd57b
parent 3469 011566d72331
child 3471 482275e38224
net.http: Add http.formencode() for www-form-urlencoded from an array of fields (thanks dersd)
net/http.lua
--- a/net/http.lua	Tue Aug 24 23:27:58 2010 +0100
+++ b/net/http.lua	Fri Aug 27 18:33:45 2010 +0100
@@ -17,8 +17,9 @@
 local listener = connlisteners_get("httpclient") or error("No httpclient listener!");
 
 local t_insert, t_concat = table.insert, table.concat;
-local tonumber, tostring, pairs, xpcall, select, debug_traceback, char, format =
-        tonumber, tostring, pairs, xpcall, select, debug.traceback, string.char, string.format;
+local pairs, ipairs = pairs, ipairs;
+local tonumber, tostring, xpcall, select, debug_traceback, char, format =
+        tonumber, tostring, xpcall, select, debug.traceback, string.char, string.format;
 
 local log = require "util.logger".init("http");
 
@@ -27,6 +28,23 @@
 function urlencode(s) return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end)); end
 function 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 formencode(form)
+	local result = {};
+	for _, field in ipairs(form) do
+		t_insert(result, _formencodepart(field.name).."=".._formencodepart(field.value));
+	end
+	return t_concat(result, "&");
+end
+
 local function expectbody(reqt, code)
     if reqt.method == "HEAD" then return nil end
     if code == 204 or code == 304 or code == 301 then return nil end