Fetching contributors…
Cannot retrieve contributors at this time
89 lines (82 sloc) 3.52 KB
(ns ring.adapter.jetty
"Adapter for the Jetty webserver."
(:import (org.eclipse.jetty.server Server Request)
(org.eclipse.jetty.server.handler AbstractHandler)
(org.eclipse.jetty.server.nio SelectChannelConnector)
(org.eclipse.jetty.server.ssl SslSelectChannelConnector)
(org.eclipse.jetty.util.thread QueuedThreadPool)
(org.eclipse.jetty.util.ssl SslContextFactory)
(javax.servlet.http HttpServletRequest HttpServletResponse))
(:require [ring.util.servlet :as servlet]))
(defn- proxy-handler
"Returns an Jetty Handler implementation for the given Ring handler."
(proxy [AbstractHandler] []
(handle [_ ^Request base-request request response]
(let [request-map (servlet/build-request-map request)
response-map (handler request-map)]
(when response-map
(servlet/update-servlet-response response response-map)
(.setHandled base-request true))))))
(defn- ssl-context-factory
"Creates a new SslContextFactory instance from a map of options."
(let [context (SslContextFactory.)]
(if (string? (options :keystore))
(.setKeyStorePath context (options :keystore))
(.setKeyStore context (options :keystore)))
(.setKeyStorePassword context (options :key-password))
(when (options :truststore)
(.setTrustStore context (options :truststore)))
(when (options :trust-password)
(.setTrustPassword context (options :trust-password)))
(case (options :client-auth)
:need (.setNeedClientAuth context true)
:want (.setWantClientAuth context true)
(defn- ssl-connector
"Creates a SslSelectChannelConnector instance."
(doto (SslSelectChannelConnector. (ssl-context-factory options))
(.setPort (options :ssl-port 443))
(.setHost (options :host))))
(defn- create-server
"Construct a Jetty Server instance."
(let [connector (doto (SelectChannelConnector.)
(.setPort (options :port 80))
(.setHost (options :host)))
server (doto (Server.)
(.addConnector connector)
(.setSendDateHeader true))]
(when (or (options :ssl?) (options :ssl-port))
(.addConnector server (ssl-connector options)))
(defn ^Server run-jetty
"Start a Jetty webserver to serve the given handler according to the
supplied options:
:configurator - a function called with the Jetty Server instance
:port - the port to listen on (defaults to 80)
:host - the hostname to listen on
:join? - blocks the thread until server ends (defaults to true)
:ssl? - allow connections over HTTPS
:ssl-port - the SSL port to listen on (defaults to 443, implies :ssl?)
:keystore - the keystore to use for SSL connections
:key-password - the password to the keystore
:truststore - a truststore to use for SSL connections
:trust-password - the password to the truststore
:max-threads - the maximum number of threads to use (default 50)
:client-auth - SSL client certificate authenticate, may be set to :need,
:want or :none (defaults to :none)"
[handler options]
(let [^Server s (create-server (dissoc options :configurator))]
(doto s
(.setHandler (proxy-handler handler))
(.setThreadPool (QueuedThreadPool. (options :max-threads 50))))
(when-let [configurator (:configurator options)]
(configurator s))
(.start s)
(when (:join? options true)
(.join s))