Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

89 lines (82 sloc) 3.56 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.)]
(.setKeyStorePath context (options :keystore))
(.setKeyStorePassword context (options :key-password))
(.setTrustAll context (boolean (options :trust-all?)))
(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 250)
:client-auth - SSL client certificate authentication; may be set to :need,
:want or :none (defaults to :none)
:trust-all? - set to true to accept all client certificates"
[handler options]
(let [^Server s (create-server (dissoc options :configurator))]
(when-let [configurator (:configurator options)]
(configurator s))
(doto s
(.setHandler (proxy-handler handler))
(.setThreadPool (QueuedThreadPool. (options :max-threads 250)))
(when (:join? options true)
(.join s))
Jump to Line
Something went wrong with that request. Please try again.