Hello, I am using Reitit with OpenAPI. So far great, but we've ran into an issue where the openapi endpoint (`/openapi.json` ) causes our logging middleware to run on repeat. Here's our openapi endpoint:
["/openapi.json"
{:get {:no-doc true
:openapi {:info {:title "Emmet API"
:description "Emmet API documentation"
:version "0.0.1"}
;; used in /secure APIs below
}
:handler (openapi/create-openapi-handler)}}]
;; middleware stack
(defn middleware-stack
[database
session-store]
{;;:reitit.middleware/transform dev/print-request-diffs ;; pretty diffs
:validate reitit.ring.spec/validate
:exception pretty/exception
:data {:coercion reitit.coercion.malli/coercion
:muuntaja m/instance
:middleware [openapi/openapi-feature
;; database
[add-database database]
[logging/request-id]
;; query-params & form-params
parameters/parameters-middleware
;; content-negotiation
muuntaja/format-negotiate-middleware
;; encoding response body
muuntaja/format-response-middleware
;; exception handling
exception/exception-middleware
;; decoding request body
muuntaja/format-request-middleware
;; coercing response bodys
coercion/coerce-response-middleware
;; coercing request parameters
coercion/coerce-request-middleware
;; cookies
; wrap-cookies
wrap-params
;; multipart
[wrap-session
{:store session-store}]
multipart/multipart-middleware
[logging/log-requests]
[logging/log-responses]
[wrap-cors
:access-control-allow-origin [#".*"]
:access-control-allow-credentials "true"
:access-control-allow-methods [:get :post :put :delete]]]}})
;; logging middleware
(defn log-requests
[handler]
(fn [{:keys [params uri session request-method cookies]
:as request}]
(µ/log ::request
:params params
:route uri
:session session
:method request-method
:cookies cookies)
(handler request)))
Any idea as to what could be causing this? No other endpoint produces this error.The culprit is this middleware:
(defn log-responses
[handler]
(fn [{:keys [uri] :as request}]
(try
(let [{:keys [body status]
:as response} (handler request)]
(µ/log ::response
:body body
:status status)
response)
(catch Exception e
(µ/log ::exception-response
:route uri
:stacktrace (with-out-str
(stacktrace/print-stack-trace e))
:message (.getMessage e)
:data (ex-data e))
{:status 500
:body "Internal service error"}))))