diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index c61598e1..8d0a1989 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -131,7 +131,7 @@ (let [uri (:uri request)] (if (str/ends-with? uri "/") (if (not= method :add) - (maybe-redirect request (subs uri 0 (-> uri count dec)))) + (maybe-redirect request (str/replace-first uri #"/+$" ""))) (if (not= method :strip) (maybe-redirect request (str uri "/"))))))] (fn diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 010d6a88..3edc486a 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -281,7 +281,11 @@ (testing "strips 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 "strips multiple slashes" + (is (= 301 (:status (app {:request-method :get, :uri "/slash-less/////"})))) + (is (= 308 (:status (app {:request-method :post, :uri "/slash-less//"}))))))) (testing "without option (equivalent to using :method :both)" (let [app (ring/ring-handler @@ -300,7 +304,11 @@ (testing "strips 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 "strips multiple slashes" + (is (= 301 (:status (app {:request-method :get, :uri "/slash-less/////"})))) + (is (= 308 (:status (app {:request-method :post, :uri "/slash-less//"}))))))))) (deftest async-ring-test (let [promise #(let [value (atom ::nil)]