Skip to content

Commit

Permalink
feat: upgarde http3 module to latest QuicServerConnector api
Browse files Browse the repository at this point in the history
  • Loading branch information
sunng87 committed Mar 9, 2024
1 parent 582a591 commit ce77496
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 91 deletions.
2 changes: 1 addition & 1 deletion http3/project.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(def jetty-version "12.0.7")

(defproject info.sunng/ring-jetty9-adapter-http3 "0.4.6"
(defproject info.sunng/ring-jetty9-adapter-http3 "0.5.0-SNAPSHOT"
:description "Ring adapter for jetty 9 and above, meta package for http3"
:url "http://github.com/sunng87/ring-jetty9-adapter"
:license {:name "Eclipse Public License"
Expand Down
162 changes: 80 additions & 82 deletions http3/src/ring/adapter/jetty9/http3.clj
Original file line number Diff line number Diff line change
@@ -1,105 +1,103 @@
(ns ring.adapter.jetty9.http3
(:import [org.eclipse.jetty.server
HttpConfiguration SecureRequestCustomizer]
[org.eclipse.jetty.http3.api Session$Server$Listener]
[org.eclipse.jetty.http3 HTTP3Configuration]
[org.eclipse.jetty.http3.server
HTTP3ServerConnectionFactory HTTP3ServerConnector
AbstractHTTP3ServerConnectionFactory]
[org.eclipse.jetty.quic.common QuicConfiguration]
HTTP3ServerConnectionFactory RawHTTP3ServerConnectionFactory]
[org.eclipse.jetty.quic.server ServerQuicConfiguration QuicServerConnector]
[org.eclipse.jetty.http3.api Session$Server$Listener]
[java.nio.file Path]))

(defn- default-sesison-listener []
(reify Session$Server$Listener))

(defn- http3-server-connection-factory
"Configure http3 specific options on HTTP3ServerConnectionFactory created from HttpConfiguration"
([^AbstractHTTP3ServerConnectionFactory factory-from-http-config]
(http3-server-connection-factory factory-from-http-config nil))
([^AbstractHTTP3ServerConnectionFactory factory-from-http-config http3-options]
(let [{:keys [input-buffer-size max-blocked-streams
max-request-headers-size max-response-headers-size
output-buffer-size stream-idle-timeout
use-input-direct-byte-buffers use-output-direct-byte-buffers]}
http3-options
"Configure http3 specific options on HTTP3ServerConnectionFactory"
[quic-config http3-options]
(let [{:keys [input-buffer-size max-blocked-streams
max-request-headers-size max-response-headers-size
output-buffer-size stream-idle-timeout
use-input-direct-byte-buffers use-output-direct-byte-buffers]}
http3-options

http3-config-factory
(RawHTTP3ServerConnectionFactory. quic-config (default-sesison-listener))

^HTTP3Configuration
http3-configuration (.getHTTP3Configuration http3-config-factory)

^HTTP3Configuration http3-config
(.getHTTP3Configuration factory-from-http-config)
option-provided?
#(contains? http3-options %)]
(cond-> http3-configuration
(option-provided? :input-buffer-size)
(doto (.setInputBufferSize input-buffer-size))

option-provided?
#(contains? http3-options %)]
(cond-> http3-config
(option-provided? :input-buffer-size)
(doto (.setInputBufferSize input-buffer-size))
(option-provided? :max-blocked-streams)
(doto (.setMaxBlockedStreams max-blocked-streams))

(option-provided? :max-blocked-streams)
(doto (.setMaxBlockedStreams max-blocked-streams))
(option-provided? :max-request-headers-size)
(doto (.setMaxRequestHeadersSize max-request-headers-size))

(option-provided? :max-request-headers-size)
(doto (.setMaxRequestHeadersSize max-request-headers-size))
(option-provided? :max-response-headers-size)
(doto (.setMaxResponseHeadersSize max-response-headers-size))

(option-provided? :max-response-headers-size)
(doto (.setMaxResponseHeadersSize max-response-headers-size))
(option-provided? :output-buffer-size)
(doto (.setOutputBufferSize output-buffer-size))

(option-provided? :output-buffer-size)
(doto (.setOutputBufferSize output-buffer-size))
(option-provided? :stream-idle-timeout)
(doto (.setStreamIdleTimeout stream-idle-timeout))

(option-provided? :stream-idle-timeout)
(doto (.setStreamIdleTimeout stream-idle-timeout))
(option-provided? :use-input-direct-byte-buffers)
(doto (.setUseInputDirectByteBuffers use-input-direct-byte-buffers))

(option-provided? :use-input-direct-byte-buffers)
(doto (.setUseInputDirectByteBuffers use-input-direct-byte-buffers))
(option-provided? :use-output-direct-byte-buffers)
(doto (.setUseOutputDirectByteBuffers use-output-direct-byte-buffers)))

(option-provided? :use-output-direct-byte-buffers)
(doto (.setUseOutputDirectByteBuffers use-output-direct-byte-buffers)))
factory-from-http-config)))
http3-config-factory))

(defn- http3-server-connector
(defn- server-quic-configuration
"Configure quic specific options on HTTP3ServerConnector"
([^HTTP3ServerConnector http3-connector-default]
(http3-server-connector http3-connector-default nil))
([^HTTP3ServerConnector http3-connector-default http3-options]
(let [{:keys [bidirectional-stream-recv-window disable-active-migration
max-bidirectional-remote-streams max-unidirectional-remote-streams
protocols session-recv-window
unidirectional-stream-recv-window
pem-work-directory]}
http3-options

^QuicConfiguration quic-config
(.getQuicConfiguration http3-connector-default)

option-provided?
#(contains? http3-options %)]
(cond-> quic-config
(option-provided? :pem-work-directory)
(doto (.setPemWorkDirectory (Path/of pem-work-directory (into-array String []))))

(option-provided? :bidirectional-stream-recv-window)
(doto (.setBidirectionalStreamRecvWindow bidirectional-stream-recv-window))

(option-provided? :disable-active-migration)
(doto (.setDisableActiveMigration disable-active-migration))

(option-provided? :max-bidirectional-remote-streams)
(doto (.setMaxBidirectionalRemoteStreams max-bidirectional-remote-streams))

(option-provided? :max-unidirectional-remote-streams)
(doto (.setMaxUnidirectionalRemoteStreams max-unidirectional-remote-streams))

(option-provided? :protocols)
(doto (.setProtocols protocols))

(option-provided? :session-recv-window)
(doto (.setSessionRecvWindow session-recv-window))

(option-provided? :unidirectional-stream-recv-window)
(doto (.setUnidirectionalStreamRecvWindow unidirectional-stream-recv-window)))
http3-connector-default)))

(defn http3-connector [server http-configuration http3-options ssl-context-factory port host]
(let [connection-factory (-> (HTTP3ServerConnectionFactory. http-configuration)
(http3-server-connection-factory http3-options))
connector (-> (HTTP3ServerConnector. server ssl-context-factory
(into-array HTTP3ServerConnectionFactory [connection-factory]))
(http3-server-connector http3-options))]
[ssl-factory pem-work-directory quic-options]
(let [{:keys [bidirectional-stream-recv-window disable-active-migration
max-bidirectional-remote-streams max-unidirectional-remote-streams
protocols session-recv-window
unidirectional-stream-recv-window]}
quic-options

^ServerQuicConfiguration quic-config
(ServerQuicConfiguration. ssl-factory (Path/of pem-work-directory (into-array String [])))

option-provided?
#(contains? quic-options %)]
(cond-> quic-config
(option-provided? :bidirectional-stream-recv-window)
(doto (.setBidirectionalStreamRecvWindow bidirectional-stream-recv-window))

(option-provided? :disable-active-migration)
(doto (.setDisableActiveMigration disable-active-migration))

(option-provided? :max-bidirectional-remote-streams)
(doto (.setMaxBidirectionalRemoteStreams max-bidirectional-remote-streams))

(option-provided? :max-unidirectional-remote-streams)
(doto (.setMaxUnidirectionalRemoteStreams max-unidirectional-remote-streams))

(option-provided? :protocols)
(doto (.setProtocols protocols))

(option-provided? :session-recv-window)
(doto (.setSessionRecvWindow session-recv-window))

(option-provided? :unidirectional-stream-recv-window)
(doto (.setUnidirectionalStreamRecvWindow unidirectional-stream-recv-window)))
quic-config))

(defn quic-server-connector [server http3-options ssl-context-factory pem-work-directory port host]
(let [quic-config (server-quic-configuration ssl-context-factory pem-work-directory http3-options)
connection-factory (http3-server-connection-factory quic-config http3-options)
connector (QuicServerConnector. server ^ServerQuicConfiguration quic-config
(into-array RawHTTP3ServerConnectionFactory [connection-factory]))]
(doto connector
(.setPort port)
(.setHost host))))
2 changes: 1 addition & 1 deletion project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
:dependencies [[org.clojure/clojure "1.11.1"]
[ring/ring-core "1.11.0" :exclusions [commons-io]]
[org.ring-clojure/ring-websocket-protocols "1.11.0"]
[info.sunng/ring-jetty9-adapter-http3 "0.4.6" :optional true]
[info.sunng/ring-jetty9-adapter-http3 "0.5.0-SNAPSHOT" :optional true]
[org.eclipse.jetty/jetty-server ~jetty-version]
[org.eclipse.jetty/jetty-util ~jetty-version]
[org.eclipse.jetty.websocket/jetty-websocket-jetty-api ~jetty-version]
Expand Down
12 changes: 6 additions & 6 deletions src/ring/adapter/jetty9.clj
Original file line number Diff line number Diff line change
Expand Up @@ -201,10 +201,10 @@
(.setHost host)
(.setIdleTimeout max-idle-time))))

(defn- http3-connector [& args]
(defn- quic-server-connector [& args]
;; load http3 module dynamically
(let [http3-connector* @(requiring-resolve 'ring.adapter.jetty9.http3/http3-connector)]
(apply http3-connector* args)))
(let [quic-server-connector* @(requiring-resolve 'ring.adapter.jetty9.http3/quic-server-connector)]
(apply quic-server-connector* args)))

(defn- create-server
"Construct a Jetty Server instance."
Expand Down Expand Up @@ -249,9 +249,9 @@
ssl? (conj (https-connector server http-configuration @ssl-factory
h2? h2-options ssl-port host max-idle-time))
http? (conj (http-connector server http-configuration h2c? h2-options port host max-idle-time proxy?))
http3? (conj (http3-connector server http-configuration
(assoc http3-options :pem-work-directory http3-pem-work-directory)
@ssl-factory ssl-port host)))]
http3? (conj (quic-server-connector server http3-options
@ssl-factory http3-pem-work-directory
ssl-port host)))]
(when (and ssl?
(not (false? ssl-hot-reload?))
(some? (.getKeyStorePath ^SslContextFactory @ssl-factory)))
Expand Down
2 changes: 1 addition & 1 deletion test/ring/adapter/jetty9_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@
:use-input-direct-byte-buffers false
:use-output-direct-byte-buffers false}]
(.mkdirs (clojure.java.io/file pem-work-dir))
(with-jetty [server [dummy-app {:ssl-port 50524
(with-jetty [server [dummy-app {:ssl-port 50525
:port 50523
:ssl? true
:join? false
Expand Down

0 comments on commit ce77496

Please sign in to comment.