Adding CORS to Ring Middleware
Tuesday, August 16th, 2016Bret and I finally got the CORS support for ring middleware working in our applications. It required that we get the starting point for the CORS support from another project, and then augment it to make sure it was working for all the cases we needed.
Basically, you need to start with:
[rwilson/ring-cors "0.1.9"]
in your project.clj, and then in the server.clj for the library, we reference it:
[ring.middleware.cors :as cors]
and then create the middleware function:
(def wrap-cors "This is a simple convenience definition for enabling the CORS support in middleware for a service. The use of this will be far simpler than including all this in every service." #(cors/wrap-cors % :access-control-allow-origin #".+" :access-control-allow-headers ["Origin" "Content-Type" "Accept" "Authorization" "Last-Modified" "Credentials" "X-Request-Id" "X-Session-Id"] :access-control-allow-methods [:get :put :post :delete]))
And with this, you can then simply put this into your middleware stack and it takes care of all the work:
(def app "The actual ring handler that is run -- this is the routes above wrapped in various middlewares." (-> app-routes wrap-json-with-padding (wrap-ssl-redirect { :ssl-port (cfg/jetty :https-redirect) }) handler/site wrap-cors wrap-params wrap-cookies wrap-logging wrap-proxy-loggly wrap-gzip))