Ring adapter for Jetty 9 with HTTP2 and WebSocket support.
This is a simple and plain wrapper on Jetty 9. It doesn't introduce additional thread model or anything else (no unofficial ring variance, no core.async). You are free to add those on top of our base API.
As of Ring 1.6, the official Jetty adapter has been updated to Jetty 9.2. However, rj9a tracks most recent Jetty release and offers additional features like http/2 and websocket.
In the REPL:
(require '[ring.adapter.jetty9 :refer [run-jetty]])
(run-jetty app {:port 50505}) ;; same as the 'official' adapter
In ns declaration:
(ns my.server
(:require [ring.adapter.jetty9 :refer [run-jetty]]))
(require '[ring.adapter.jetty9 :refer [run-jetty]])
(defn app [request send-response raise-error]
(send-response {:body "It works!"}))
(run-jetty app {:port 50505 :async? true})
You can define following handlers for websocket events.
(def ws-handler {:on-connect (fn [ws])
:on-error (fn [ws e])
:on-close (fn [ws status-code reason])
:on-text (fn [ws text-message])
:on-bytes (fn [ws bytes offset len])})
WebSocketProtocol allows you to read and write data on the ws
value:
Notice that we support different type of msg:
A callback can also be specified for send!
:
(send! ws msg {:write-failed (fn [throwable]) :write-success (fn [])})
A callback is a map where keys :write-failed
and :write-success
are optional.
There is a new option :websockets
available. Accepting a map of context path and listener class:
(use 'ring.adapter.jetty9)
(run-jetty app {:websockets {"/loc" ws-handler}})
In the javascript:
// remember to add the trailing slash.
// Otherwise, jetty will return a 302 on websocket upgrade request,
// which is not supported by most browsers.
var ws = new WebSocket("ws://somehost/loc/");
ws.onopen = ....
If you want to omit the trailing slash from your URLs (and not receive a redirect from Jetty), you can start the server like:
(run-jetty app {:websockets {"/loc" ws-handler}
:allow-null-path-info true})
You can find examples in examples
folder. To run example:
lein with-profile default,example-http run
a very basic
example of ring handlerlein with-profile default,example-async run
ring 1.6 async
handler examplelein with-profile default,example-http2 run
(NOTE that your
will need JDK8 to run this example)lein with-profile default,example-websocket run
Copyright © 2013-2017 Sun Ning
Distributed under the Eclipse Public License, the same as Clojure.
Can you improve this documentation?Edit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close