diff --git a/build.clj b/build.clj index 59c212a..3aa218c 100644 --- a/build.clj +++ b/build.clj @@ -1,6 +1,5 @@ (ns build (:require - [babashka.fs :as fs] [clojure.java.io :as io] [clojure.string :as str] [clojure.tools.build.api :as b] diff --git a/deps.edn b/deps.edn index 4872a4a..5811f01 100644 --- a/deps.edn +++ b/deps.edn @@ -1,15 +1,13 @@ {:paths ["src" "resources"] :deps {org.clojure/clojure {:mvn/version "1.11.1"} - org.clojure/data.json {:mvn/version "2.4.0"} ; https://github.com/thheller/shadow-cljs/issues/872 ; ring middleware - ring/ring-core {:mvn/version "1.9.4"} - metosin/muuntaja {:mvn/version "0.6.8"} ; 30x faster than ring-middleware-format + ring/ring-core {:mvn/version "1.13.0"} ; https://github.com/ring-clojure/ring + metosin/muuntaja {:mvn/version "0.6.10"} ; 30x faster than ring-middleware-format ring-cors/ring-cors {:mvn/version "0.1.13"} bk/ring-gzip {:mvn/version "0.3.0"} ; from oz - ring/ring-devel {:mvn/version "1.9.4"} ; reload middleware - same version as rig/core - + ring/ring-devel {:mvn/version "1.13.0"} ; reload middleware - same version as rig/core bidi/bidi {:mvn/version "2.1.6"} - ring/ring-defaults {:mvn/version "0.3.3" + ring/ring-defaults {:mvn/version "0.5.0" :exclusions [javax.servlet/servlet-api]} prone/prone {:mvn/version "2021-04-23"} ; exception middleware ring/ring-json {:mvn/version "0.5.1"} @@ -21,18 +19,18 @@ ;simplevalue/letsencrypt {:git/url "https://github.com/SimpleValue/sv.letsencrypt.git" ; :sha "8b1a85846acaaa37a58b054f2372d8fde0663b75"} ; webserver - info.sunng/ring-jetty9-adapter {:mvn/version "0.15.2"} ; uses jetty 10.0.2, vlast version with java 9 : 0.14.0 - + ;info.sunng/ring-jetty9-adapter {:mvn/version "0.15.2"} ; uses jetty 10.0.2, + ;info.sunng/ring-jetty9-adapter {:mvn/version "0.36.0"} ; jetty 12, but could not get it to work with sente. + ring/ring-jetty-adapter {:mvn/version "1.13.0"} ; jetty 11 + hiccup/hiccup {:mvn/version "1.0.5"} ; server side templating - ; modular - org.pinkgorilla/modular {:mvn/version "0.0.38"} ; encoding + org.pinkgorilla/modular {:mvn/version "0.2.61"} ; encoding } :aliases - {:outdated {:extra-deps {com.github.liquidz/antq {:mvn/version "RELEASE"}} - :main-opts ["-m" "antq.core"]} + { :test {:extra-paths ["test"] :extra-deps {io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner.git" @@ -46,9 +44,7 @@ :build {:deps {io.github.clojure/tools.build {:git/tag "v0.6.1" :git/sha "515b334"} io.github.slipset/deps-deploy {:git/sha "b4359c5d67ca002d9ed0c4b41b710d7e5a82e3bf"} - io.github.seancorfield/build-clj {:git/tag "v0.5.4" :git/sha "bc9c0cc"} - ;rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} - babashka/fs {:mvn/version "0.0.5"}} + io.github.seancorfield/build-clj {:git/tag "v0.5.4" :git/sha "bc9c0cc"}} :ns-default build} :webserver {:extra-paths ["src-demo"] diff --git a/src-demo/demo/https.clj b/src-demo/demo/https.clj index 90c69a5..81bb963 100644 --- a/src-demo/demo/https.clj +++ b/src-demo/demo/https.clj @@ -1,6 +1,6 @@ (ns demo.https (:require - [modular.webserver.jetty :refer [run-jetty-server]] + [modular.webserver.server.jetty :refer [run-jetty-server]] [modular.webserver.handler.not-found :refer [not-found-handler]] [modular.webserver.handler.files :refer [->FilesMaybe ->ResourcesMaybe]] [modular.webserver.middleware.bidi :refer [wrap-bidi]] diff --git a/src/modular/webserver/handler/files.clj b/src/modular/webserver/handler/files.clj index ccf0509..caeddcf 100644 --- a/src/modular/webserver/handler/files.clj +++ b/src/modular/webserver/handler/files.clj @@ -10,7 +10,7 @@ (defrecord FilesMaybe [options] bidi/Matched - (resolve-handler [this m] + (resolve-handler [_this m] (let [reminder (url-decode (:remainder m)) filename (str (:dir options) reminder)] ;(warn "file-maybe: " filename) @@ -18,8 +18,8 @@ ;(warn "file found: " filename) (assoc (dissoc m :remainder) :handler (-> - (fn [req] (file-response reminder - {:root (:dir options)})) + (fn [_req] (file-response reminder + {:root (:dir options)})) (wrap-content-type options) (wrap-not-modified) (wrap-gzip)))))) @@ -32,14 +32,14 @@ (defrecord ResourcesMaybe [options] bidi/Matched - (resolve-handler [this m] + (resolve-handler [_this m] (let [path (url-decode (:remainder m))] (when (not-empty path) - (when-let [res (io/resource (str (:prefix options) path))] + (when-let [_res (io/resource (str (:prefix options) path))] ;(warn "res: " path) (assoc (dissoc m :remainder) :handler (-> - (fn [req] (resource-response (str (:prefix options) path))) + (fn [_req] (resource-response (str (:prefix options) path))) (wrap-content-type options) (wrap-not-modified) ; awb99 hack (wrap-gzip))))))) diff --git a/src/modular/webserver/handler/not_found.clj b/src/modular/webserver/handler/not_found.clj index 45ac3fa..aa86f5d 100644 --- a/src/modular/webserver/handler/not_found.clj +++ b/src/modular/webserver/handler/not_found.clj @@ -6,5 +6,5 @@ (def not-found-body "

bummer, not found (response) ; Don't pass the requests down, just return what the browser needs to continue. + (-> (response "") ; Don't pass the requests down, just return what the browser needs to continue. (assoc-in [:headers "Access-Control-Allow-Origin"] allowed-origins) (assoc-in [:headers "Access-Control-Allow-Methods"] "GET,POST,DELETE") (assoc-in [:headers "Access-Control-Allow-Headers"] "X-Requested-With,Content-Type,Cache-Control,Origin,Accept,Authorization") diff --git a/src/modular/webserver/middleware/dev.clj b/src/modular/webserver/middleware/dev.clj index 439b72d..0760e5b 100644 --- a/src/modular/webserver/middleware/dev.clj +++ b/src/modular/webserver/middleware/dev.clj @@ -1,6 +1,6 @@ (ns modular.webserver.middleware.dev (:require - [taoensso.timbre :refer [debug info warn error]] + [taoensso.timbre :refer [warn]] [prone.middleware :refer [wrap-exceptions]] [ring.middleware.reload :refer [wrap-reload]])) diff --git a/src/modular/webserver/middleware/exception.clj b/src/modular/webserver/middleware/exception.clj index 8a138f5..2763b86 100644 --- a/src/modular/webserver/middleware/exception.clj +++ b/src/modular/webserver/middleware/exception.clj @@ -1,7 +1,7 @@ (ns modular.webserver.middleware.exception (:require [clojure.string] - [taoensso.timbre :refer [debug info error]])) + [taoensso.timbre :refer [error]])) (defn wrap-fallback-exception [handler] diff --git a/src/modular/webserver/middleware/transit.clj b/src/modular/webserver/middleware/transit.clj index 40c0231..843f32b 100644 --- a/src/modular/webserver/middleware/transit.clj +++ b/src/modular/webserver/middleware/transit.clj @@ -1,6 +1,5 @@ (ns modular.webserver.middleware.transit (:require - [cognitect.transit :as transit] [modular.encoding.transit :as e] [muuntaja.core :as m])) diff --git a/src/modular/webserver/page.clj b/src/modular/webserver/page.clj index f3e066c..3f5857b 100644 --- a/src/modular/webserver/page.clj +++ b/src/modular/webserver/page.clj @@ -1,9 +1,7 @@ (ns modular.webserver.page (:require - [clojure.string :as str] [hiccup.page :as page])) - (defn- head ([config] (head config [])) @@ -29,7 +27,6 @@ [:link {:rel "shortcut icon" :href (str prefix icon)}]]] (into head extra-head)))) - (defn page ([config body] (page/html5 @@ -41,4 +38,3 @@ {:mode :html} (head config extra-head) body))) - \ No newline at end of file diff --git a/src/modular/webserver/server.clj b/src/modular/webserver/server.clj new file mode 100644 index 0000000..3181de2 --- /dev/null +++ b/src/modular/webserver/server.clj @@ -0,0 +1,21 @@ +(ns modular.webserver.server + (:require + [taoensso.timbre :as timbre :refer [info error]] + [modular.webserver.server.jetty :as jetty] + [modular.webserver.server.httpkit :as httpkit])) + +(defn start [webserver-config ring-handler server-type] + (let [server (case server-type + :jetty (jetty/start-jetty ring-handler webserver-config) + :httpkit (httpkit/start-httpkit ring-handler webserver-config) + (do (error "start-server failed: server type not found: " type) + nil))] + {:server-type server-type + :server server})) + +(defn stop [{:keys [server server-type]}] + (when server + (case server-type + :jetty (jetty/stop-jetty server) + :httpkit (httpkit/stop-httpkit server) + (info "there was no server started.")))) diff --git a/src/modular/webserver/server/httpkit.clj b/src/modular/webserver/server/httpkit.clj new file mode 100644 index 0000000..a1fc6fa --- /dev/null +++ b/src/modular/webserver/server/httpkit.clj @@ -0,0 +1,24 @@ +(ns modular.webserver.server.httpkit + (:require + [taoensso.timbre :as timbre :refer [info]])) + +; http://http-kit.github.io/ +;https://github.com/http-kit/http-kit +; this dependency is not part of webly dependencies: ;{http-kit "2.5.3"} + +(defn start-httpkit + [ring-handler config] + (let [run-server (requiring-resolve 'org.httpkit.server/run-server) + default-opts {:allow-null-path-info true ; omit the trailing slash from your URLs + :ws-max-idle-time 3600000 ; important for nrepl middleware + } + {:keys [port]} config] + (info "Starting Httpkit web server (http:" port ")") + (run-server ring-handler {:port port + :host "0.0.0.0"}))) + +(defn stop-httpkit [server] + (info "stopping httpkit server..") + ;(server) ; Immediate shutdown (breaks existing reqs) + ;; Graceful shutdown (wait <=100 msecs for existing reqs to complete): + (server :timeout 100)) \ No newline at end of file diff --git a/src/modular/webserver/jetty.clj b/src/modular/webserver/server/jetty.clj similarity index 51% rename from src/modular/webserver/jetty.clj rename to src/modular/webserver/server/jetty.clj index c208ee8..c0c5f2e 100644 --- a/src/modular/webserver/jetty.clj +++ b/src/modular/webserver/server/jetty.clj @@ -1,27 +1,38 @@ -(ns modular.webserver.jetty +(ns modular.webserver.server.jetty (:require [clojure.java.io :as io] [taoensso.timbre :as timbre :refer [info]] - [ring.adapter.jetty9 :refer [run-jetty]])) + ;[ring.adapter.jetty9 :refer [run-jetty]] + [ring.adapter.jetty :refer [run-jetty]])) -(defn run-jetty-server [ring-handler ws-map user-opts] +(defn run-jetty-server [ring-handler {:keys [port ssl-port keystore] :as user-opts}] (let [default-opts {:allow-null-path-info true ; omit the trailing slash from your URLs :ws-max-idle-time 3600000 ; important for nrepl middleware } - ws-opts (if ws-map - {:websockets ws-map} ; {"/api/chsk" (wrap-webly (partial ws-handshake-handler conn))} - {}) - {:keys [port ssl-port keystore]} user-opts https? (and ssl-port keystore (.exists (io/file keystore))) user-opts (if https? user-opts - (dissoc user-opts :keystore :ssl-port :key-password))] + (dissoc user-opts :keystore :ssl-port :key-password)) + + opts (merge default-opts ;ws-opts + user-opts)] ; https://github.com/sunng87/ring-jetty9-adapter (if https? (info "Starting Jetty web server (http:" port "https:" ssl-port ")") (info "Starting Jetty web server (http:" port "https: none)")) - (run-jetty ring-handler (merge default-opts ws-opts user-opts)))) + (run-jetty ring-handler opts))) + +(defn start-jetty + [ring-handler config] + (run-jetty-server ring-handler + (assoc config :join? false))) +(defn stop-jetty + [server] + ;https://github.com/dharrigan/websockets/blob/master/src/online/harrigan/api/router.clj + (info "stopping jetty-server..") + (.stop server) ; stop is async + (.join server)) ; so let's make sure it's really stopped! \ No newline at end of file diff --git a/src/modular/webserver/undertow.clj b/src/modular/webserver/undertow.clj deleted file mode 100644 index 72039d1..0000000 --- a/src/modular/webserver/undertow.clj +++ /dev/null @@ -1,26 +0,0 @@ - - - ;{luminus/ring-undertow-adapter "1.2.0"} - - ;undertow - ;[ring.adapter.undertow :refer [run-undertow]] - ;[shadow.cljs.devtools.server :as shadow-server] - -; https://github.com/luminus-framework/ring-undertow-adapter -#_(defn run-undertow-server [ring-handler port host api] - (require '[ring.adapter.undertow :refer [run-undertow]]) - (let [;run-undertow (resolve) - conn (init-ws! :undertow)] - (info "Starting Undertow web server at port " port " ..") - (run-undertow ring-handler {:port port - :host host - ; :websockets {"/api/chsk" (wrap-webly (partial ws-handshake-handler conn))} - ;:allow-null-path-info true - ;:join? false - }))) - -#_(defn run-shadow-server [] - (let [conn (init-ws! :undertow)] - ;(shadow-server/start!) - ;(shadow-server/stop!) - )) \ No newline at end of file