Skip to content

Commit df46973

Browse files
committed
Add unix domain socket support
Signed-off-by: Loukas Agorgianitis <loukas@agorgianitis.com>
1 parent 7d54a32 commit df46973

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

ring-jetty-adapter/project.clj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
[ring/ring-core "1.12.2"]
99
[org.ring-clojure/ring-jakarta-servlet "1.12.2"]
1010
[org.eclipse.jetty/jetty-server "11.0.21"]
11+
[org.eclipse.jetty/jetty-unixdomain-server "11.0.21"]
1112
[org.eclipse.jetty.websocket/websocket-jetty-server "11.0.21"]]
1213
:aliases {"test-all" ["with-profile" "default:+1.10:+1.11:+1.12" "test"]}
1314
:profiles
1415
{:dev {:dependencies [[clj-http "3.13.0"]
1516
[less-awful-ssl "1.0.6"]
1617
[hato "0.9.0"]]
1718
:jvm-opts ["-Dorg.eclipse.jetty.server.HttpChannelState.DEFAULT_TIMEOUT=500"]}
19+
:test {:dependencies [[org.eclipse.jetty/jetty-client "11.0.21"]]}
1820
:1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]}
1921
:1.11 {:dependencies [[org.clojure/clojure "1.11.2"]]}
2022
:1.12 {:dependencies [[org.clojure/clojure "1.12.0-alpha9"]]}})

ring-jetty-adapter/src/ring/adapter/jetty.clj

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"A Ring adapter that uses the Jetty 9 embedded web server.
33
44
Adapters are used to convert Ring handlers into running web servers."
5-
(:require [ring.util.jakarta.servlet :as servlet]
5+
(:require [clojure.java.io :as io]
6+
[ring.util.jakarta.servlet :as servlet]
67
[ring.websocket :as ws]
78
[ring.websocket.protocols :as wsp])
89
(:import [java.nio ByteBuffer]
@@ -15,6 +16,7 @@
1516
HttpConnectionFactory
1617
SslConnectionFactory
1718
SecureRequestCustomizer]
19+
[org.eclipse.jetty.unixdomain.server UnixDomainServerConnector]
1820
[org.eclipse.jetty.servlet ServletContextHandler ServletHandler]
1921
[org.eclipse.jetty.util BlockingArrayQueue]
2022
[org.eclipse.jetty.util.thread ThreadPool QueuedThreadPool]
@@ -161,6 +163,10 @@
161163
(ServerConnector. server #^"[Lorg.eclipse.jetty.server.ConnectionFactory;"
162164
(into-array ConnectionFactory factories)))
163165

166+
(defn- unix-domain-server-connector ^UnixDomainServerConnector [^Server server & factories]
167+
(UnixDomainServerConnector. server #^"[Lorg.eclipse.jetty.server.ConnectionFactory;"
168+
(into-array ConnectionFactory factories)))
169+
164170
(defn- http-config ^HttpConfiguration [options]
165171
(doto (HttpConfiguration.)
166172
(.setSendDateHeader (:send-date-header? options true))
@@ -229,6 +235,14 @@
229235
(.setHost (options :host))
230236
(.setIdleTimeout (options :max-idle-time 200000)))))
231237

238+
(defn- unix-socket-connector ^ServerConnector [server options]
239+
(let [http-factory (HttpConnectionFactory. (http-config options))
240+
socket (io/file (options :unix-socket))]
241+
(.deleteOnExit socket)
242+
(doto (unix-domain-server-connector server http-factory)
243+
(.setUnixDomainPath (.toPath socket))
244+
(.setIdleTimeout (options :max-idle-time 200000)))))
245+
232246
(defn- create-threadpool [options]
233247
(let [min-threads (options :min-threads 8)
234248
max-threads (options :max-threads 50)
@@ -253,6 +267,8 @@
253267
(.addConnector server (http-connector server options)))
254268
(when (or (options :ssl?) (options :ssl-port))
255269
(.addConnector server (ssl-connector server options)))
270+
(when (options :unix-socket)
271+
(.addConnector server (unix-socket-connector server options)))
256272
server))
257273

258274
(defn run-jetty
@@ -266,6 +282,7 @@
266282
:async-timeout-handler - an async handler to handle an async context timeout
267283
:port - the port to listen on (defaults to 80)
268284
:host - the hostname to listen on
285+
:unix-socket - the unix domain socket path to listen on
269286
:join? - blocks the thread until server ends
270287
(defaults to true)
271288
:daemon? - use daemon threads (defaults to false)

ring-jetty-adapter/test/ring/adapter/test/jetty.clj

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@
88
[ring.core.protocols :as p]
99
[ring.websocket :as ws]
1010
[ring.websocket.protocols :as wsp])
11-
(:import [java.nio ByteBuffer]
11+
(:import [java.io File]
12+
[java.nio ByteBuffer]
13+
[java.nio.file Paths]
1214
[org.eclipse.jetty.util.thread QueuedThreadPool]
1315
[org.eclipse.jetty.server Server Request SslConnectionFactory]
1416
[org.eclipse.jetty.server.handler AbstractHandler]
17+
[org.eclipse.jetty.io ClientConnector]
18+
[org.eclipse.jetty.client HttpClient]
19+
[org.eclipse.jetty.client.http HttpClientTransportOverHTTP]
1520
[java.net ServerSocket ConnectException]
1621
[java.security KeyStore]
1722
[java.io SequenceInputStream ByteArrayInputStream InputStream
@@ -81,6 +86,11 @@
8186

8287
(def test-ssl-url (str "https://localhost:" test-ssl-port))
8388

89+
(def test-unix-domain-socket
90+
(let [sock-file (File/createTempFile "ring-jetty-" ".sock")]
91+
(.delete sock-file)
92+
(.getAbsolutePath sock-file)))
93+
8494
(def nil-keystore
8595
(doto (KeyStore/getInstance (KeyStore/getDefaultType)) (.load nil)))
8696

@@ -102,6 +112,22 @@
102112
"text/plain"))
103113
(is (= (:body response) "Hello World")))))
104114

115+
(let [java-version (->> (System/getProperty "java.version")
116+
(re-find #"\A\d+")
117+
(Integer/parseInt))]
118+
(when (>= java-version 16)
119+
(testing "UNIX Socket server"
120+
(with-server hello-world {:http? false
121+
:unix-socket test-unix-domain-socket}
122+
(let [path (Paths/get test-unix-domain-socket (make-array String 0))
123+
connector (ClientConnector/forUnixDomain path)
124+
transport (HttpClientTransportOverHTTP. connector)
125+
client (doto (HttpClient. transport) (.start))
126+
response (.GET client "http://localhost")]
127+
(is (= (.getStatus response) 200))
128+
(is (.getMediaType response) "text/plain")
129+
(is (= (.getContentAsString response) "Hello World")))))))
130+
105131
(testing "HTTPS server"
106132
(with-server hello-world {:port test-port
107133
:ssl-port test-ssl-port

0 commit comments

Comments
 (0)