Add query-string to redirect-trailing-slash-handler

This commit is contained in:
Ilmo Raunio 2023-01-20 00:06:49 +02:00
parent c2c267f4d8
commit 0870b20a05
2 changed files with 36 additions and 6 deletions

View file

@ -133,10 +133,10 @@
"
([] (redirect-trailing-slash-handler {:method :both}))
([{:keys [method]}]
(letfn [(maybe-redirect [request path]
(letfn [(maybe-redirect [{:keys [query-string] :as request} path]
(if (and (seq path) (r/match-by-path (::r/router request) path))
{:status (if (= (:request-method request) :get) 301 308)
:headers {"Location" path}
:headers {"Location" (if query-string (str path "?" query-string) path)}
:body ""}))
(redirect-handler [request]
(let [uri (:uri request)]

View file

@ -1,6 +1,6 @@
(ns reitit.ring-test
(:require [clojure.set :as set]
[clojure.test :refer [deftest is testing]]
[clojure.test :refer [are deftest is testing]]
[reitit.core :as r]
[reitit.middleware :as middleware]
[reitit.ring :as ring]
@ -312,7 +312,15 @@
(testing "does not strip slashes"
(is (= nil (app {:request-method :get, :uri "/slash-less/"})))
(is (= nil (app {:request-method :post, :uri "/slash-less/"}))))))
(is (= nil (app {:request-method :post, :uri "/slash-less/"}))))
(testing "retains query-string in location header"
(are [method uri]
(is (= "/with-slash/?kikka=kukka"
(get-in (app {:request-method method :uri uri :query-string "kikka=kukka"})
[:headers "Location"])))
:get "/with-slash"
:post "/with-slash"))))
(testing "using :method :strip"
(let [app (ring/ring-handler
@ -338,7 +346,17 @@
(testing "strips multiple slashes"
(is (= 301 (:status (app {:request-method :get, :uri "/slash-less/////"}))))
(is (= 308 (:status (app {:request-method :post, :uri "/slash-less//"})))))))
(is (= 308 (:status (app {:request-method :post, :uri "/slash-less//"})))))
(testing "retains query-string in location header"
(are [method uri]
(is (= "/slash-less?kikka=kukka"
(get-in (app {:request-method method :uri uri :query-string "kikka=kukka"})
[:headers "Location"])))
:get "/slash-less/"
:get "/slash-less//"
:post "/slash-less/"
:post "/slash-less//"))))
(testing "without option (equivalent to using :method :both)"
(let [app (ring/ring-handler
@ -361,7 +379,19 @@
(testing "strips multiple slashes"
(is (= 301 (:status (app {:request-method :get, :uri "/slash-less/////"}))))
(is (= 308 (:status (app {:request-method :post, :uri "/slash-less//"})))))))))
(is (= 308 (:status (app {:request-method :post, :uri "/slash-less//"})))))
(testing "retains query-string in location header"
(are [method uri expected-location]
(is (= expected-location
(get-in (app {:request-method method :uri uri :query-string "kikka=kukka"})
[:headers "Location"])))
:get "/with-slash" "/with-slash/?kikka=kukka"
:get "/slash-less/" "/slash-less?kikka=kukka"
:get "/slash-less//" "/slash-less?kikka=kukka"
:post "/with-slash" "/with-slash/?kikka=kukka"
:post "/slash-less/" "/slash-less?kikka=kukka"
:post "/slash-less//" "/slash-less?kikka=kukka"))))))
(deftest async-ring-test
(let [promise #(let [value (atom ::nil)]