Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
89 lines (82 sloc) 3.608 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."
[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."
[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)
nil)
context))
(defn- ssl-connector
"Creates a SslSelectChannelConnector instance."
[options]
(doto (SslSelectChannelConnector. (ssl-context-factory options))
(.setPort (options :ssl-port 443))
(.setHost (options :host))))
(defn- create-server
"Construct a Jetty Server instance."
[options]
(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)))
server))
(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))
s))
Jump to Line
Something went wrong with that request. Please try again.