-
-
Notifications
You must be signed in to change notification settings - Fork 193
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #160 from nginx-clojure/master
Add nginx-clojure support (@xfeep)
- Loading branch information
Showing
4 changed files
with
56 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
(ns taoensso.sente.server-adapters.nginx-clojure | ||
"Experimental- subject to change! | ||
Optional Nginx-Clojure v0.4.2+ adapter for use with Sente." | ||
(:require [taoensso.sente.interfaces :as i] | ||
[nginx.clojure.core :as ncc])) | ||
|
||
(def ^:dynamic *max-message-size* nginx.clojure.WholeMessageAdapter/DEFAULT_MAX_MESSAGE_SIZE) | ||
|
||
(extend-type nginx.clojure.NginxHttpServerChannel | ||
i/IAsyncNetworkChannel | ||
(open? [nc-ch] (not (ncc/closed? nc-ch))) | ||
(close! [nc-ch] (ncc/close! nc-ch)) | ||
(send!* [nc-ch msg close-after-send?] | ||
(let [closed? (ncc/closed? nc-ch)] | ||
(ncc/send! nc-ch msg true (boolean close-after-send?)) | ||
(not closed?)))) | ||
|
||
(deftype NginxClojureAsyncNetworkChannelAdapter [] | ||
i/IAsyncNetworkChannelAdapter | ||
(ring-req->net-ch-resp [net-ch-adapter ring-req callbacks-map] | ||
(let [{:keys [on-open on-msg on-close]} callbacks-map | ||
nc-ch (ncc/hijack! ring-req true) | ||
upgrade-ok? (ncc/websocket-upgrade! nc-ch false)] | ||
;; Returns {:status 200 :body <nginx-clojure-implementation-channel>}: | ||
(when (not upgrade-ok?) ;; send general header for non-websocket request | ||
(.setIgnoreFilter nc-ch false) | ||
;; Give a chance to set client broken listener. | ||
;; Generally it can be mereged with invoking send-header! | ||
;; e.g. (send-header! nc-ch 200, ..., true, false) | ||
;; We do not merge them here just to make its behavior be the same with | ||
;; those of other server adapters | ||
(ncc/send! nc-ch nil true false) | ||
(ncc/send-header! nc-ch 200 {"Content-Type" "text/html"} false false)) | ||
(ncc/add-aggregated-listener! nc-ch *max-message-size* | ||
{:on-open (when on-open (fn [nc-ch] (on-open nc-ch))) | ||
:on-error nil ;;Do we need/want this? | ||
:on-message (when on-msg (fn [nc-ch msg] (on-msg nc-ch msg))) | ||
:on-close (when on-close (fn [nc-ch reason] (on-close nc-ch reason)))}) | ||
{:status 200 :body nc-ch}))) | ||
|
||
(def nginx-clojure-adapter (NginxClojureAsyncNetworkChannelAdapter.)) | ||
(def sente-web-server-adapter nginx-clojure-adapter) ; Alias for ns import convenience |