Skip to content

Instantly share code, notes, and snippets.

@eerohele
Last active November 19, 2021 16:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eerohele/5e382d270df37bc94d1ff0ccef4e6efc to your computer and use it in GitHub Desktop.
Save eerohele/5e382d270df37bc94d1ff0ccef4e6efc to your computer and use it in GitHub Desktop.
JEP 408 com.sun.net.httpserver: Clojure Hello World
(import '(com.sun.net.httpserver HttpHandlers HttpServer Headers Filter))
(import '(java.net InetSocketAddress))
(import '(java.util.function UnaryOperator))
(defn make-handler
[{:keys [status headers body]}]
(HttpHandlers/of status (Headers/of headers) body))
(def identity-filter
(Filter/adaptRequest "Identity"
(reify UnaryOperator
(apply [this arg] (identity arg)))))
(defn make-server
[& {:keys [port routes]}]
(let [address (InetSocketAddress. port)
root-handler (make-handler (get routes "/"))
filters (into-array Filter [identity-filter])
server (HttpServer/create address 0 "/" root-handler filters)]
(run!
(fn [[path handler]]
(.createContext server path (make-handler handler)))
(dissoc routes "/"))
server))
(def routes
{"/"
{:status 200
:headers {"Content-Type" ["text/plain"]}
:body "Hello, world!"}
"/html"
{:status 200
:headers {"Content-Type" ["text/html"]}
:body "<strong>Hello, world!</strong>"}})
(def server
(doto (make-server :port 9000 :routes routes) .start))
(.stop server 0)
(require '[clojure.java.browse :as browse])
(browse/browse-url "http://[::1]:9000")
(browse/browse-url "http://[::1]:9000/html")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment