Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions ring-core/src/ring/middleware/nested_params.clj
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,19 @@
{:arglists '([request] [request options])
:added "1.2"}
[request & [opts]]
(let [parse (:key-parser opts parse-nested-keys)]
(update-in request [:params] nest-params parse)))
(let [parse (:key-parser opts parse-nested-keys)
params-keys (:params-keys opts [:params])]
(reduce #(update-in %1 [%2] nest-params parse) request params-keys)))

(defn wrap-nested-params
"Middleware to converts a flat map of parameters into a nested map.
Accepts the following options:

:key-parser - the function to use to parse the parameter names into a list
of keys. Keys that are empty strings are treated as elements in
a vector, non-empty keys are treated as elements in a map.
Defaults to the parse-nested-keys function.
:key-parser - the function to use to parse the parameter names into a list
of keys. Keys that are empty strings are treated as elements in
a vector, non-empty keys are treated as elements in a map.
Defaults to the parse-nested-keys function.
:params-keys - a vector of keys to be processed, defaults to [:params].

For example:

Expand Down
6 changes: 5 additions & 1 deletion ring-core/test/ring/middleware/test/nested_params.clj
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,11 @@
(handler {:params {"foo" [{"bar" "baz" "asdf" "zxcv"}]}}))))
(testing "double-nested map"
(is (= {"foo" {"key" {"bar" "baz" "asdf" "zxcv"}}}
(handler {:params {"foo" {"key" {"bar" "baz" "asdf" "zxcv"}}}}))))))
(handler {:params {"foo" {"key" {"bar" "baz" "asdf" "zxcv"}}}})))))
(let [handler (wrap-nested-params identity {:params-keys [:form-params :query-params]})]
(testing "alternate parameter keys"
(is (= {:form-params {"a" {"b" {"c" "d"}}} :query-params {"foo" ["bar"]}}
(handler {:form-params {"a[b][c]" "d"} :query-params {"foo[]" "bar"}}))))))

(deftest nested-params-test-with-options
(let [handler (wrap-nested-params :params
Expand Down