From 172155eb4650e8d81610cbf2e8d358b28003fddc Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 19 Apr 2018 11:56:44 +0200 Subject: [PATCH] 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 --- modules/luci-base/luasrc/http.lua | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/luci-base/luasrc/http.lua b/modules/luci-base/luasrc/http.lua index aa8913607..29edb4470 100644 --- a/modules/luci-base/luasrc/http.lua +++ b/modules/luci-base/luasrc/http.lua @@ -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 -- 2.11.0