|
7 | 7 | [ring.websocket :as ws]
|
8 | 8 | [ring.websocket.protocols :as wsp])
|
9 | 9 | (:import [java.nio ByteBuffer]
|
| 10 | + [java.time Duration] |
10 | 11 | [org.eclipse.jetty.server
|
11 | 12 | Request
|
12 | 13 | Server
|
|
96 | 97 | (.setAcceptedSubProtocol resp protocol))
|
97 | 98 | (websocket-listener listener))))
|
98 | 99 |
|
99 |
| -(defn- upgrade-to-websocket [^HttpServletRequest request response response-map] |
| 100 | +(defn- upgrade-to-websocket |
| 101 | + [^HttpServletRequest request response response-map options] |
100 | 102 | (let [context (.getServletContext request)
|
101 | 103 | container (JettyWebSocketServerContainer/getContainer context)
|
102 | 104 | creator (websocket-creator response-map)]
|
| 105 | + (doto container |
| 106 | + (.setIdleTimeout (Duration/ofMillis (:ws-idle-timeout options 30000))) |
| 107 | + (.setMaxTextMessageSize (:ws-max-text-size options 65536)) |
| 108 | + (.setMaxBinaryMessageSize (:ws-max-binary-size options 65536))) |
103 | 109 | (.upgrade container creator request response)))
|
104 | 110 |
|
105 |
| -(defn- proxy-handler ^ServletHandler [handler] |
| 111 | +(defn- proxy-handler ^ServletHandler [handler options] |
106 | 112 | (proxy [ServletHandler] []
|
107 | 113 | (doHandle [_ ^Request base-request request response]
|
108 | 114 | (let [request-map (servlet/build-request-map request)
|
109 | 115 | response-map (handler request-map)]
|
110 | 116 | (try
|
111 | 117 | (if (ws/websocket-response? response-map)
|
112 |
| - (upgrade-to-websocket request response response-map) |
| 118 | + (upgrade-to-websocket request response response-map options) |
113 | 119 | (servlet/update-servlet-response response response-map))
|
114 | 120 | (finally
|
115 | 121 | (.setHandled base-request true)))))))
|
|
119 | 125 | (.sendError response 500 (.getMessage exception))
|
120 | 126 | (.complete context)))
|
121 | 127 |
|
122 |
| -(defn- async-jetty-respond [^AsyncContext context request response] |
| 128 | +(defn- async-jetty-respond [^AsyncContext context request response options] |
123 | 129 | (fn [response-map]
|
124 | 130 | (if (ws/websocket-response? response-map)
|
125 |
| - (do (upgrade-to-websocket request response response-map) |
| 131 | + (do (upgrade-to-websocket request response response-map options) |
126 | 132 | (.complete context))
|
127 | 133 | (servlet/update-servlet-response response context response-map))))
|
128 | 134 |
|
129 |
| -(defn- async-timeout-listener [request context response handler] |
| 135 | +(defn- async-timeout-listener [request context response handler options] |
130 | 136 | (proxy [AsyncListener] []
|
131 | 137 | (onTimeout [^AsyncEvent _]
|
132 | 138 | (handler (servlet/build-request-map request)
|
133 |
| - (async-jetty-respond context request response) |
| 139 | + (async-jetty-respond context request response options) |
134 | 140 | (async-jetty-raise context response)))
|
135 | 141 | (onComplete [^AsyncEvent _])
|
136 | 142 | (onError [^AsyncEvent _])
|
137 | 143 | (onStartAsync [^AsyncEvent _])))
|
138 | 144 |
|
139 |
| -(defn- async-proxy-handler ^ServletHandler [handler timeout timeout-handler] |
| 145 | +(defn- async-proxy-handler ^ServletHandler |
| 146 | + [handler {:keys [async-timeout async-timeout-handler] |
| 147 | + :or {async-timeout 0} |
| 148 | + :as options}] |
140 | 149 | (proxy [ServletHandler] []
|
141 | 150 | (doHandle [_ ^Request base-request ^HttpServletRequest request response]
|
142 | 151 | (let [^AsyncContext context (.startAsync request)]
|
143 |
| - (.setTimeout context timeout) |
144 |
| - (when timeout-handler |
145 |
| - (.addListener |
146 |
| - context |
147 |
| - (async-timeout-listener request context response timeout-handler))) |
| 152 | + (.setTimeout context async-timeout) |
| 153 | + (when async-timeout-handler |
| 154 | + (.addListener context |
| 155 | + (async-timeout-listener request context response |
| 156 | + async-timeout-handler options))) |
148 | 157 | (try
|
149 | 158 | (handler
|
150 | 159 | (servlet/build-request-map request)
|
151 |
| - (async-jetty-respond context request response) |
| 160 | + (async-jetty-respond context request response options) |
152 | 161 | (async-jetty-raise context response))
|
153 | 162 | (finally
|
154 | 163 | (.setHandled base-request true)))))))
|
|
163 | 172 | (ServerConnector. server #^"[Lorg.eclipse.jetty.server.ConnectionFactory;"
|
164 | 173 | (into-array ConnectionFactory factories)))
|
165 | 174 |
|
166 |
| -(defn- unix-domain-server-connector ^UnixDomainServerConnector [^Server server & factories] |
| 175 | +(defn- unix-domain-server-connector ^UnixDomainServerConnector |
| 176 | + [^Server server & factories] |
167 | 177 | (UnixDomainServerConnector. server #^"[Lorg.eclipse.jetty.server.ConnectionFactory;"
|
168 | 178 | (into-array ConnectionFactory factories)))
|
169 | 179 |
|
|
323 | 333 | :output-buffer-size - the response body buffer size (default 32768)
|
324 | 334 | :request-header-size - the maximum size of a request header (default 8192)
|
325 | 335 | :response-header-size - the maximum size of a response header (default 8192)
|
326 |
| - :send-server-version? - add Server header to HTTP response (default true)" |
| 336 | + :send-server-version? - add Server header to HTTP response (default true) |
| 337 | + :ws-idle-timeout - the idle timeout for WebSockets in milliseconds |
| 338 | + (default 30000) |
| 339 | + :ws-max-binary-size - the maximum allowed size in bytes for a WebSocket |
| 340 | + binary message (default 65536) |
| 341 | + :ws-max-text-size - the maximum allowed size in bytes for a WebSocket |
| 342 | + text message (default 65536)" |
327 | 343 | ^Server [handler options]
|
328 | 344 | (let [server (create-server (dissoc options :configurator))
|
329 | 345 | proxy (if (:async? options)
|
330 |
| - (async-proxy-handler handler |
331 |
| - (:async-timeout options 0) |
332 |
| - (:async-timeout-handler options)) |
333 |
| - (proxy-handler handler))] |
| 346 | + (async-proxy-handler handler options) |
| 347 | + (proxy-handler handler options))] |
334 | 348 | (.setHandler server (context-handler proxy))
|
335 | 349 | (when-let [configurator (:configurator options)]
|
336 | 350 | (configurator server))
|
|
0 commit comments