From a620ec59998fb05d1b2e24e55e3607d1b57b803e Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 24 Sep 2018 20:19:42 +0300 Subject: [PATCH] Set Allow-header on default-options-handler --- modules/reitit-ring/src/reitit/ring.cljc | 9 +++++++-- test/cljc/reitit/ring_test.cljc | 9 +++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 20e8c890..fdb44e29 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -7,6 +7,9 @@ [ring.util.response :as response]]) [clojure.string :as str])) +(declare get-match) +(declare get-router) + (def http-methods #{:get :head :post :put :delete :connect :options :trace :patch}) (defrecord Methods [get head post put delete connect options trace patch]) (defrecord Endpoint [data handler path method middleware]) @@ -53,8 +56,10 @@ (->methods (:handler top) data) childs)))) -(defn default-options-handler [_] - {:status 200, :body ""}) +(defn default-options-handler [request] + (let [methods (->> request get-match :result (keep (fn [[k v]] (if v k)))) + allow (->> methods (map (comp str/upper-case name)) (str/join ","))] + {:status 200, :body "", :headers {"Allow" allow}})) ;; ;; public api diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 13224848..e339c73a 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -198,19 +198,20 @@ (is (= -406 (:status (app {:request-method :get, :uri "/pong"})))))))))) (deftest default-options-handler-test - (let [response {:status 200, :body "ok"} - options-response (ring/default-options-handler :request)] + (let [response {:status 200, :body "ok"}] (testing "with defaults" (let [app (ring/ring-handler (ring/router - [["/get" {:get (constantly response)}] + [["/get" {:get (constantly response) + :post (constantly response)}] ["/options" {:options (constantly response)}] ["/any" (constantly response)]]))] (testing "endpoint with a non-options handler" (is (= response (app {:request-method :get, :uri "/get"}))) - (is (= options-response (app {:request-method :options, :uri "/get"})))) + (is (= {:status 200, :body "", :headers {"Allow" "GET,POST,OPTIONS"}} + (app {:request-method :options, :uri "/get"})))) (testing "endpoint with a options handler" (is (= response (app {:request-method :options, :uri "/options"}))))