Не удается выполнить промежуточное ПО, если используется обработчик исключений?
wrap-cors не возвращает заголовки контроля доступа, когда есть неверный запрос к моей конечной точке API. Я считаю, что это потому, что я использую обработчик исключений, который может блокировать запуск промежуточного программного обеспечения. Я хочу знать, как я все еще могу выполнить промежуточное программное обеспечение для этого маршрута и добавить заголовки cors к ответу на неверные запросы.
обработчик исключений
(defn- bad-request-handler
"Handles bad requests."
[f]
(f
(ring/response {:status "bad request"})))
приложение
(def app
(api
{:exceptions {:handlers
{::ex/request-validation (bad-request-handler response/bad-request)}}}
(POST "/" [] :body [item {(schema/required-key :item) schema/Bool}]
:middleware [#(wrap-cors % :access-control-allow-origin [#".*"]
:access-control-allow-methods [:post])]
:responses {200 {:description "ok"}
400 {:description "bad request"}} item)))
1 ответ
Я решил добавить свои собственные заголовки, а не использовать r0man/ring-cors. Я могу определить содержание Access-Control-Allow-Methods
извлекая :request-method
значение из запроса. Однако это делает предположение, что плохой обработчик запросов будет вызываться только по действительным маршрутам.
(defn- append-cors
"Allow requests from all origins"
[methods]
{"Access-Control-Allow-Origin" "*"
"Access-Control-Allow-Methods" methods})
(defn- bad-request-handler
"Handles bad requests."
[f]
(fn [^Exception e data request]
(->
(f request)
(update-in [:headers] merge (->
(request :request-method)
(name)
(clojure.string/upper-case)
(append-cors)))
(assoc :body {:status "bad request"}))))
Я до сих пор не совсем уверен, почему заголовки Cors добавляются только тогда, когда запрос разрешен.