changeset 4066:07ae583bc565

mod_rest: Add support for form-encoded output This roughtly matches the input capabilities when given an form-encoded payload.
author Kim Alvefur <zash@zash.se>
date Mon, 20 Jul 2020 21:42:11 +0200
parents 92152437ecfe
children 5790c3cf615b
files mod_rest/mod_rest.lua
diffstat 1 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mod_rest/mod_rest.lua	Tue Jul 07 17:08:08 2020 +0100
+++ b/mod_rest/mod_rest.lua	Mon Jul 20 21:42:11 2020 +0200
@@ -111,6 +111,7 @@
 local supported_outputs = {
 	"application/xmpp+xml",
 	"application/json",
+	"application/x-www-form-urlencoded",
 };
 
 if have_cbor then
@@ -118,9 +119,27 @@
 	table.insert(supported_outputs, "application/cbor");
 end
 
+-- Only { string : string } can be form-encoded, discard the rest
+-- (jsonmap also discards anything unknown or unsupported)
+local function flatten(t)
+	local form = {};
+	for k, v in pairs(t) do
+		if type(v) == "string" then
+			form[k] = v;
+		elseif type(v) == "number" then
+			form[k] = tostring(v);
+		elseif v == true then
+			form[k] = "";
+		end
+	end
+	return form;
+end
+
 local function encode(type, s)
 	if type == "application/json" then
 		return json.encode(jsonmap.st2json(s));
+	elseif type == "application/x-www-form-urlencoded" then
+		return http.formencode(flatten(jsonmap.st2json(s)));
 	elseif type == "application/cbor" then
 		return cbor.encode(jsonmap.st2json(s));
 	elseif type == "text/plain" then