diff --git a/README.md b/README.md index f88dbac..d302250 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ that can serve resources, directories or a typical ring handler. [](dependency) ```clojure -[pandeiro/boot-http "0.7.3"] ;; latest release +[pandeiro/boot-http "0.7.4-SNAPSHOT"] ;; latest release ``` [](/dependency) @@ -101,12 +101,23 @@ boot -d pandeiro/boot-http serve -d . -p 8888 wait #### -k / --httpkit -Use the HTTP Kit webserver instead of Jetty. +Use the HTTP Kit webserver instead of Jetty. (DEPRECATED: see server) ```bash boot -d pandeiro/boot-http serve -d . -k wait # uses httpkit ``` +#### -S / --server + +Run server using "jetty" (default), "httpkit", or "immutant". + +```bash +boot -d pandeiro/boot-http serve -d . # uses jetty +boot -d pandeiro/boot-http serve -d . -S jetty # uses jetty +boot -d pandeiro/boot-http serve -d . -S httpkit # uses httpkit +boot -d pandeiro/boot-http serve -d . -S immutant # uses immutant +``` + #### -n / --nrepl Start an nREPL server for access to the http server. Accepts diff --git a/src/pandeiro/boot_http.clj b/src/pandeiro/boot_http.clj index b269b93..c3903f9 100644 --- a/src/pandeiro/boot_http.clj +++ b/src/pandeiro/boot_http.clj @@ -18,6 +18,9 @@ (def httpkit-dep '[http-kit "2.1.19"]) +(def immutant-dep + '[org.immutant/immutant "2.1.5"]) + (def nrepl-dep '[org.clojure/tools.nrepl "0.2.11"]) @@ -28,20 +31,25 @@ "Start a web server on localhost, serving resources and optionally a directory. Listens on port 3000 by default." - [d dir PATH str "The directory to serve; created if doesn't exist." - H handler SYM sym "The ring handler to serve." - i init SYM sym "A function to run prior to starting the server." - c cleanup SYM sym "A function to run after the server stops." - r resource-root ROOT str "The root prefix when serving resources from classpath" - p port PORT int "The port to listen on. (Default: 3000)" - k httpkit bool "Use Http-kit server instead of Jetty" - s silent bool "Silent-mode (don't output anything)" - R reload bool "Reload modified namespaces on each request." - n nrepl REPL edn "nREPL server parameters e.g. \"{:port 3001, :bind \"0.0.0.0\"}\"" - N not-found SYM sym "a ring handler for requested resources that aren't in your directory. Useful for pushState."] + [d dir PATH str "The directory to serve; created if doesn't exist." + H handler SYM sym "The ring handler to serve." + i init SYM sym "A function to run prior to starting the server." + c cleanup SYM sym "A function to run after the server stops." + r resource-root ROOT str "The root prefix when serving resources from classpath" + p port PORT int "The port to listen on. (Default: 3000)" + k httpkit bool "Use Http-kit server instead of Jetty. (DEPRECATED: see server)" + s silent bool "Silent-mode (don't output anything)" + R reload bool "Reload modified namespaces on each request." + S server SERVER kw "Run server using \"jetty\" (default), \"httpkit\", or \"immutant\"." + n nrepl REPL edn "nREPL server parameters e.g. \"{:port 3001, :bind \"0.0.0.0\"}\"" + N not-found SYM sym "a ring handler for requested resources that aren't in your directory. Useful for pushState."] (let [port (or port default-port) - server-dep (if httpkit httpkit-dep jetty-dep) + server-type (or server (if httpkit :httpkit :jetty)) + server-dep (case server-type + :httpkit httpkit-dep + :immutant immutant-dep + :jetty jetty-dep) deps (cond-> serve-deps true (conj server-dep) (seq nrepl) (conj nrepl-dep)) @@ -54,10 +62,10 @@ '[boot.util :as boot]) (when '~init (u/resolve-and-invoke '~init)) - (def server + (def http-server (http/server {:dir ~dir, :port ~port, :handler '~handler, - :reload '~reload, :env-dirs ~(vec (:directories pod/env)), :httpkit ~httpkit, + :reload '~reload, :env-dirs ~(vec (:directories pod/env)), :server ~server-type, :not-found '~not-found, :resource-root ~resource-root})) (def nrepl-server @@ -65,9 +73,9 @@ (http/nrepl-server {:nrepl ~nrepl}))) (when-not ~silent (boot/info "Started %s on http://localhost:%d\n" - (:human-name server) - (:local-port server)))))] - (when (and silent (not httpkit)) + (:human-name http-server) + (:local-port http-server)))))] + (when (and silent (= server-type :jetty)) (silence-jetty!)) (core/cleanup (pod/with-eval-in worker @@ -75,12 +83,12 @@ (when-not silent (util/info "Stopping boot-http nREPL server")) (.stop nrepl-server)) - (when server + (when http-server (when-not silent - (util/info "Stopping %s\n" (:human-name server))) - ((:stop-server server))) + (util/info "Stopping %s\n" (:human-name http-server))) + ((:stop-server http-server))) (when '~cleanup (u/resolve-and-invoke '~cleanup)))) (core/with-pre-wrap fileset @start - (assoc fileset :http-port (pod/with-eval-in worker (:local-port server)))))) + (assoc fileset :http-port (pod/with-eval-in worker (:local-port http-server)))))) diff --git a/src/pandeiro/boot_http/impl.clj b/src/pandeiro/boot_http/impl.clj index 503ebaf..7a10a1b 100644 --- a/src/pandeiro/boot_http/impl.clj +++ b/src/pandeiro/boot_http/impl.clj @@ -101,7 +101,7 @@ (resources-handler opts))) ;; -;; Jetty / HTTP Kit +;; Jetty / HTTP Kit / Immutant ;; (defn- start-httpkit [handler opts] @@ -111,6 +111,15 @@ {:stop-server stop-server :human-name "HTTP Kit"}))) +(defn- start-immutant [handler opts] + (require 'immutant.web) + (let [server ((resolve 'immutant.web/run) handler (dissoc opts :join?)) + stop-server (resolve 'immutant.web/stop)] + {:server server + :human-name "Immutant" + :local-port (:port server) + :stop-server #(stop-server server)})) + (defn- start-jetty [handler opts] (require 'ring.adapter.jetty) (let [server ((resolve 'ring.adapter.jetty/run-jetty) handler opts)] @@ -119,8 +128,11 @@ :local-port (-> server .getConnectors first .getLocalPort) :stop-server #(.stop server)})) -(defn server [{:keys [port httpkit] :as opts}] - ((if httpkit start-httpkit start-jetty) +(defn server [{:keys [port server] :as opts}] + ((case server + :httpkit start-httpkit + :immutant start-immutant + :jetty start-jetty) (-> (ring-handler opts) wrap-content-type wrap-not-modified)