Fork me on GitHub

Thanks to a suggestion by @seancorfield to use a middleware function for this I came up with the following which works. Excuse the beginner-level Clojure 😅

;; middleware.clj

(def api-subdomain-to-path
  {:name    ::api-subdomain-to-path
   :compile (fn [_ _]
              (fn [handler _]
                (fn [req]
                  (if (str/starts-with? (:server-name req) "api.")
                    (handler (assoc req :uri (str "/api" (:uri req))))
                    (handler req)))))})
;; core.clj

  (ring/router routes
    {:exception pretty/exception
     :data      {:middleware [...]})
  (ring/routes ...)
  {:middleware [[middleware/api-subdomain-to-path :api-subdomain-to-path]]}))
At first I had this new middleware function as first in the middleware vector in the ring/router data map, and while this did update the uri in the request the routing wasn't working. I then realised there was a different place for top-level middleware, which is given to the ring-handler.

🙌 6