Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ring async support #25

Closed
wants to merge 10 commits into from
60 changes: 46 additions & 14 deletions src/ring/middleware/cors.clj
Original file line number Diff line number Diff line change
Expand Up @@ -157,18 +157,47 @@
%
[%]))))

(defn handle-cors [handler request access-control response-handler]
(if (and (preflight? request) (allow-request? request access-control))
(let [blank-response {:status 200
:headers {}
:body "preflight complete"}]
(response-handler request access-control blank-response))
(if (origin request)
(if (allow-request? request access-control)
(if-let [response (handler request)]
(response-handler request access-control response))
(handler request))
(handler request))))
(defn- make-preflight-handler [access-control]
(fn [args]
(let [[request respond _] args
response (add-access-control request
access-control
{:status 200
:headers {}
:body "preflight complete"})]
(if (= (count args) 1)
response
(respond response)))))

(defn- wrap-handler [handler access-control]
(fn
([args]
(let [request (first args)]
(if (origin request)
(if (allow-request? request access-control)
(if (= (count args) 1)
;; synchronous request
(if-let [response (handler request)]
(add-access-control request access-control response))
;; asynchronous request
(let [[_ respond raise] args]
(handler request
#(respond (if %
(add-access-control request
access-control
%)))
raise)))
(apply handler args))
(apply handler args))))))

(defn- handle-cors [handler access-control handler-args]
(let [preflight-handler (make-preflight-handler access-control)
wrapped-handler (wrap-handler handler access-control)
request (first handler-args)]
(if (and (preflight? request)
(allow-request? request access-control))
(preflight-handler handler-args)
(wrapped-handler handler-args))))

(defn wrap-cors
"Middleware that adds Cross-Origin Resource Sharing headers.
Expand All @@ -181,5 +210,8 @@
"
[handler & access-control]
(let [access-control (normalize-config access-control)]
(fn [request]
(handle-cors handler request access-control add-access-control))))
(fn
([request]
(handle-cors handler access-control [request]))
([request respond raise]
(handle-cors handler access-control [request respond raise])))))
Loading