luci-base: properly handle repeated POST parameters
authorJo-Philipp Wich <jo@mein.io>
Thu, 19 Apr 2018 09:56:44 +0000 (11:56 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 19 Apr 2018 10:00:13 +0000 (12:00 +0200)
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>
modules/luci-base/luasrc/http.lua

index aa89136..29edb44 100644 (file)
@@ -397,7 +397,15 @@ function mimedecode_message_body(src, msg, file_cb)
                                        field.fd:seek(0, "set")
                                end
                        else
                                        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
                        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
                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
                elseif what == parser.ERROR then
                        err = buffer
                end