Skip to content

Commit

Permalink
Merge pull request #160 from nginx-clojure/master
Browse files Browse the repository at this point in the history
Add nginx-clojure support (@xfeep)
  • Loading branch information
ptaoussanis committed Sep 3, 2015
2 parents e7ffcd5 + a27a22a commit 414957d
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 0 deletions.
1 change: 1 addition & 0 deletions example-project/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
;;; ---> Choose (uncomment) a supported web server <---
[http-kit "2.1.19"]
;; [org.immutant/web "2.0.2"]
;; [nginx-clojure/nginx-clojure-embed "0.4.2"]

[ring "1.4.0"]
[ring/ring-defaults "0.1.5"] ; Includes `ring-anti-forgery`, etc.
Expand Down
12 changes: 12 additions & 0 deletions example-project/src/example/my_app.cljx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@

;; [immutant.web :as immutant]
;; [taoensso.sente.server-adapters.immutant :refer (sente-web-server-adapter)]

;; [nginx.clojure.embed :as nginx-clojure]
;; [taoensso.sente.server-adapters.nginx-clojure :refer (sente-web-server-adapter)]

;; Optional, for Transit encoding:
[taoensso.sente.packers.transit :as sente-transit])
Expand Down Expand Up @@ -86,6 +89,15 @@
;; :port (:port server)
;; :stop-fn (fn [] (immutant/stop server))}))

;;; nginx-clojure embeded
;; #+clj
;; (defn start-web-server!* [ring-handler port]
;; (println "Starting nginx-clojure...")
;; (let [port (nginx-clojure/run-server ring-handler {:port port})]
;; {:server nil ; nginx-clojure doesn't expose this
;; :port port
;; :stop-fn nginx-clojure/stop-server}))

;;;; Packer (client<->server serializtion format) config

(def packer (sente-transit/get-flexi-packer :edn)) ; Experimental, needs Transit dep
Expand Down
1 change: 1 addition & 0 deletions project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
;;
[http-kit "2.1.19"]
[org.immutant/web "2.0.0"]
[nginx-clojure "0.4.2"]
;;
[lein-pprint "1.1.1"]
[lein-ancient "0.6.7"]
Expand Down
42 changes: 42 additions & 0 deletions src/taoensso/sente/server_adapters/nginx_clojure.clj
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

0 comments on commit 414957d

Please sign in to comment.