From 28e206a9469b603c40bb023c69592570374bc8bb Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 9 Apr 2019 22:30:26 -0400 Subject: [PATCH] Apply doOnDiscard for streaming mode Use of Flux.just is problematic in that if the Flux is cancelled before demand, the item may never be read, nor freed. Flux#just does not even delegate cancellation signals. Closes gh-22731 --- .../http/codec/EncoderHttpMessageWriter.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/EncoderHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/EncoderHttpMessageWriter.java index 228f6853ec..e8058691db 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/EncoderHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/EncoderHttpMessageWriter.java @@ -131,8 +131,13 @@ public class EncoderHttpMessageWriter implements HttpMessageWriter { }); } - return (isStreamingMediaType(contentType) ? - message.writeAndFlushWith(body.map(Flux::just)) : message.writeWith(body)); + if (isStreamingMediaType(contentType)) { + return message.writeAndFlushWith(body.map(buffer -> + Mono.fromCallable(() -> buffer) + .doOnDiscard(PooledDataBuffer.class, PooledDataBuffer::release))); + } + + return message.writeWith(body); } @Nullable