Skip to content

Commit 33d8d3f

Browse files
Add support for HttpObjectAggregator in server pipeline
1 parent 88fdf95 commit 33d8d3f

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/aleph/http/server.clj

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
TooLongFrameException]
3939
[io.netty.handler.codec.http
4040
DefaultFullHttpResponse
41+
FullHttpRequest
4142
HttpContent HttpHeaders HttpUtil
4243
HttpContentCompressor
4344
HttpRequest HttpResponse
@@ -272,6 +273,16 @@
272273
(handle-request ctx req s))
273274
(reset! request req)))
274275

276+
process-full-request
277+
(fn [ctx ^FullHttpRequest req]
278+
;; HttpObjectAggregator disables chunked encoding, no need to check for it.
279+
(let [content (.content req)
280+
body (when (pos? (.readableBytes content))
281+
(netty/buf->array content))]
282+
;; Don't release content as it will happen automatically once whole
283+
;; request is released.
284+
(handle-request ctx req body)))
285+
275286
process-last-content
276287
(fn [ctx ^HttpContent msg]
277288
(let [content (.content msg)]
@@ -350,6 +361,12 @@
350361
([_ ctx msg]
351362
(cond
352363

364+
;; Happens when io.netty.handler.codec.http.HttpObjectAggregator is part of the pipeline.
365+
(instance? FullHttpRequest msg)
366+
(if (invalid-request? msg)
367+
(reject-invalid-request ctx msg)
368+
(process-full-request ctx msg))
369+
353370
(instance? HttpRequest msg)
354371
(if (invalid-request? msg)
355372
(reject-invalid-request ctx msg)
@@ -398,6 +415,21 @@
398415
([_ ctx msg]
399416
(cond
400417

418+
;; Happens when io.netty.handler.codec.http.HttpObjectAggregator is part of the pipeline.
419+
(instance? FullHttpRequest msg)
420+
(if (invalid-request? msg)
421+
(reject-invalid-request ctx msg)
422+
(let [^FullHttpRequest req msg
423+
content (.content req)
424+
ch (netty/channel ctx)
425+
s (netty/source ch)]
426+
(when-not (zero? (.readableBytes content))
427+
;; Retain the content of FullHttpRequest one extra time to
428+
;; compensate for it being released together with the request.
429+
(netty/put! ch s (netty/acquire content)))
430+
(s/close! s)
431+
(handle-request ctx req s)))
432+
401433
(instance? HttpRequest msg)
402434
(if (invalid-request? msg)
403435
(reject-invalid-request ctx msg)

0 commit comments

Comments
 (0)