forked from ring-clojure/ring
/
jetty.clj
54 lines (50 loc) · 1.85 KB
/
jetty.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(ns ring.adapter.jetty
(:import (org.mortbay.jetty.handler AbstractHandler)
(org.mortbay.jetty Server)
(org.mortbay.jetty.bio SocketConnector)
(org.mortbay.jetty.security SslSocketConnector))
(:use (ring.util servlet)
(clojure.contrib except)))
(defn- proxy-handler
"Returns an Jetty Handler implementation for the given Ring handler."
[handler]
(proxy [AbstractHandler] []
(handle [target request response dispatch]
(let [request-map (build-request-map request)
response-map (handler request-map)]
(update-servlet-response response response-map)
(.setHandled request true)))))
(defn- add-ssl-connector!
"Add an SslSocketConnector to a Jetty Server instance."
[server options]
(let [ssl-connector (SslSocketConnector.)]
(doto ssl-connector
(.setPort (options :ssl-port 443))
(.setKeystore (options :keystore))
(.setKeyPassword (options :key-password)))
(when (options :truststore)
(.setTruststore ssl-connector (options :truststore)))
(when (options :trust-password)
(.setTrustPassword ssl-connector (options :trust-password)))
(.addConnector server ssl-connector)))
(defn- create-server
"Construct a Jetty Server instance."
[options]
(let [connector (doto (SocketConnector.)
(.setPort (options :port 80))
(.setHost (options :host)))
server (doto (Server.)
(.addConnector connector)
(.setSendDateHeader true))]
(when (or (options :ssl) (options :ssl-port))
(add-ssl-connector! server options))
server))
(defn run-jetty
"Serve the given handler according to the options.
Options:
:port, an Integer."
[handler options]
(doto (create-server options)
(.setHandler (proxy-handler handler))
(.start)
(.join)))