luci-base: properly handle repeated POST parameters

Restore the old luci.http behaviour of converting repeated POST params into
single tables holding all values instead of letting each repeated parameter
overwrite the value of the preceeding one.

Fixes, among other things, the handling of CBI dynamic list values.

Fixes #1752
Fixes 59dea0230 ("luci-base: switch to lucihttp based POST data processing")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2018-04-19 11:56:44 +02:00
parent 9b22c9c1e1
commit 172155eb46

View file

@ -397,7 +397,15 @@ function mimedecode_message_body(src, msg, file_cb)
field.fd:seek(0, "set")
end
else
msg.params[field.name] = field.value or ""
local val = msg.params[field.name]
if type(val) == "table" then
val[#val+1] = field.value or ""
elseif val ~= nil then
msg.params[field.name] = { val, field.value or "" }
else
msg.params[field.name] = field.value or ""
end
end
field = nil
@ -437,7 +445,15 @@ function urldecode_message_body(src, msg)
elseif what == parser.NAME then
name = lhttp.urldecode(buffer)
elseif what == parser.VALUE and name then
msg.params[name] = lhttp.urldecode(buffer) or ""
local val = msg.params[name]
if type(val) == "table" then
val[#val+1] = lhttp.urldecode(buffer) or ""
elseif val ~= nil then
msg.params[name] = { val, lhttp.urldecode(buffer) or "" }
else
msg.params[name] = lhttp.urldecode(buffer) or ""
end
elseif what == parser.ERROR then
err = buffer
end