|
117 | 117 | [server-value keep-alive-value close-value]
|
118 | 118 | (map #(HttpHeaders/newEntity %) ["Aleph/0.5.0" "Keep-Alive" "Close"])]
|
119 | 119 | (defn send-response
|
120 |
| - [^ChannelHandlerContext ctx keep-alive? ssl? rsp] |
| 120 | + [^ChannelHandlerContext ctx keep-alive? ssl? error-handler rsp] |
121 | 121 | (let [[^HttpResponse rsp body]
|
122 | 122 | (try
|
123 | 123 | [(http/ring-response->netty-response rsp)
|
124 | 124 | (get rsp :body)]
|
125 | 125 | (catch Throwable e
|
126 |
| - (let [rsp (error-response e)] |
| 126 | + (let [rsp (error-handler e)] |
127 | 127 | [(http/ring-response->netty-response rsp)
|
128 | 128 | (get rsp :body)])))]
|
129 | 129 |
|
|
142 | 142 |
|
143 | 143 | ;;;
|
144 | 144 |
|
145 |
| -(defn invalid-value-response [req x] |
146 |
| - (error-response |
147 |
| - (IllegalArgumentException. |
148 |
| - (str "cannot treat " |
| 145 | +(defn invalid-value-exception [req x] |
| 146 | + (IllegalArgumentException. |
| 147 | + (str "cannot treat " |
149 | 148 | (pr-str x)
|
150 | 149 | " as HTTP response for request to '"
|
151 | 150 | (:uri req)
|
152 |
| - "'")))) |
| 151 | + "'"))) |
153 | 152 |
|
154 | 153 | (defn handle-request
|
155 | 154 | [^ChannelHandlerContext ctx
|
156 | 155 | ssl?
|
157 | 156 | handler
|
158 | 157 | rejected-handler
|
| 158 | + error-handler |
159 | 159 | executor
|
160 | 160 | ^HttpRequest req
|
161 | 161 | previous-response
|
|
168 | 168 | ;; handle request on a separate thread
|
169 | 169 | (try
|
170 | 170 | (d/future-with executor
|
171 |
| - (handler req')) |
| 171 | + (handler req')) |
172 | 172 | (catch RejectedExecutionException e
|
173 | 173 | (if rejected-handler
|
174 | 174 | (try
|
175 | 175 | (rejected-handler req')
|
176 | 176 | (catch Throwable e
|
177 |
| - (error-response e))) |
| 177 | + (error-handler e))) |
178 | 178 | {:status 503
|
179 | 179 | :headers {"content-type" "text/plain"}
|
180 | 180 | :body "503 Service Unavailable"})))
|
|
183 | 183 | (try
|
184 | 184 | (handler req')
|
185 | 185 | (catch Throwable e
|
186 |
| - (error-response e))))] |
| 186 | + (error-handler e))))] |
187 | 187 |
|
188 | 188 | (-> previous-response
|
189 | 189 | (d/chain'
|
190 |
| - netty/wrap-future |
191 |
| - (fn [_] |
192 |
| - (netty/release req) |
193 |
| - (-> rsp |
194 |
| - (d/catch' error-response) |
195 |
| - (d/chain' |
196 |
| - (fn [rsp] |
197 |
| - (when (not (-> req' ^AtomicBoolean (.websocket?) .get)) |
198 |
| - (send-response ctx keep-alive? ssl? |
199 |
| - (cond |
200 |
| - |
201 |
| - (map? rsp) |
202 |
| - (if head? |
203 |
| - (assoc rsp :body :aleph/omitted) |
204 |
| - rsp) |
205 |
| - |
206 |
| - (nil? rsp) |
207 |
| - {:status 204} |
208 |
| - |
209 |
| - :else |
210 |
| - (invalid-value-response req rsp)))))))))))) |
| 190 | + netty/wrap-future |
| 191 | + (fn [_] |
| 192 | + (netty/release req) |
| 193 | + (-> rsp |
| 194 | + (d/catch' error-handler) |
| 195 | + (d/chain' |
| 196 | + (fn [rsp] |
| 197 | + (when (not (-> req' ^AtomicBoolean (.websocket?) .get)) |
| 198 | + (send-response ctx keep-alive? ssl? error-handler |
| 199 | + (cond |
| 200 | + |
| 201 | + (map? rsp) |
| 202 | + (if head? |
| 203 | + (assoc rsp :body :aleph/omitted) |
| 204 | + rsp) |
| 205 | + |
| 206 | + (nil? rsp) |
| 207 | + {:status 204} |
| 208 | + |
| 209 | + :else |
| 210 | + (error-handler (invalid-value-exception req rsp))))))))))))) |
211 | 211 |
|
212 | 212 | (defn exception-handler [ctx ex]
|
213 | 213 | (cond
|
|
249 | 249 | (fn [_] (netty/close ctx)))))
|
250 | 250 |
|
251 | 251 | (defn ring-handler
|
252 |
| - [ssl? handler rejected-handler executor buffer-capacity] |
| 252 | + [ssl? handler rejected-handler error-handler executor buffer-capacity] |
253 | 253 | (let [buffer-capacity (long buffer-capacity)
|
254 | 254 | request (atom nil)
|
255 | 255 | buffer (atom [])
|
|
265 | 265 | ssl?
|
266 | 266 | handler
|
267 | 267 | rejected-handler
|
| 268 | + error-handler |
268 | 269 | executor
|
269 | 270 | req
|
270 | 271 | @previous-response
|
|
387 | 388 | (.fireChannelRead ctx msg))))))
|
388 | 389 |
|
389 | 390 | (defn raw-ring-handler
|
390 |
| - [ssl? handler rejected-handler executor buffer-capacity] |
| 391 | + [ssl? handler rejected-handler error-handler executor buffer-capacity] |
391 | 392 | (let [buffer-capacity (long buffer-capacity)
|
392 | 393 | stream (atom nil)
|
393 | 394 | previous-response (atom nil)
|
|
400 | 401 | ssl?
|
401 | 402 | handler
|
402 | 403 | rejected-handler
|
| 404 | + error-handler |
403 | 405 | executor
|
404 | 406 | req
|
405 | 407 | @previous-response
|
|
513 | 515 | {:keys
|
514 | 516 | [executor
|
515 | 517 | rejected-handler
|
| 518 | + error-handler |
516 | 519 | request-buffer-size
|
517 | 520 | max-initial-line-length
|
518 | 521 | max-header-size
|
|
530 | 533 | max-header-size 8192
|
531 | 534 | max-chunk-size 16384
|
532 | 535 | compression? false
|
533 |
| - idle-timeout 0}}] |
| 536 | + idle-timeout 0 |
| 537 | + error-handler error-response}}] |
534 | 538 | (fn [^ChannelPipeline pipeline]
|
535 | 539 | (let [handler (if raw-stream?
|
536 |
| - (raw-ring-handler ssl? handler rejected-handler executor request-buffer-size) |
537 |
| - (ring-handler ssl? handler rejected-handler executor request-buffer-size)) |
| 540 | + (raw-ring-handler ssl? handler rejected-handler error-handler executor request-buffer-size) |
| 541 | + (ring-handler ssl? handler rejected-handler error-handler executor request-buffer-size)) |
538 | 542 | ^ChannelHandler
|
539 | 543 | continue-handler (if (nil? continue-handler)
|
540 | 544 | (HttpServerExpectContinueHandler.)
|
|
0 commit comments