reitit

Nim Sadeh 2024-07-16T18:24:03.620849Z

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.

Nim Sadeh 2024-07-16T18:45:42.376139Z

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"}))))