|
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