From 0870b20a05f3835e9022f77acaf1e677316bfc3b Mon Sep 17 00:00:00 2001 From: Ilmo Raunio Date: Fri, 20 Jan 2023 00:06:49 +0200 Subject: [PATCH] Add query-string to redirect-trailing-slash-handler --- modules/reitit-ring/src/reitit/ring.cljc | 4 +-- test/cljc/reitit/ring_test.cljc | 38 +++++++++++++++++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index c98b2bc8..97fdc9d2 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -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)] diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index d7b9f8f4..efd91884 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -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)]