From 062c18a81da3c2a1959e81bb6115a957ddcccb57 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 6 Aug 2024 14:06:21 +0300 Subject: [PATCH] Add DataBuffer management in fragment rendering See gh-33194 --- .../view/ViewResolutionResultHandler.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java index 947e0e9bb35..9c635dc8ddc 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java @@ -282,8 +282,9 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp streamHandler.updateResponse(exchange); } - Flux> renderFlux = render.fragments().concatMap(fragment -> - renderFragment(fragment, streamHandler, locale, bindingContext, exchange)); + Flux> renderFlux = render.fragments() + .concatMap(fragment -> renderFragment(fragment, streamHandler, locale, bindingContext, exchange)) + .doOnDiscard(DataBuffer.class, DataBufferUtils::release); return response.writeAndFlushWith(renderFlux); } @@ -552,9 +553,16 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp DataBuffer suffix = encodeText("\n\n", charset, bufferFactory); Mono content = DataBufferUtils.join(fragmentFlux) - .map(dataBuffer -> { - String s = dataBuffer.toString(charset).replace("\n", "\ndata:"); - return bufferFactory.wrap(s.getBytes(charset)); + .map(buffer -> { + String text; + try { + text = buffer.toString(charset); + } + finally { + DataBufferUtils.release(buffer); + } + text = text.replace("\n", "\ndata:"); + return bufferFactory.wrap(text.getBytes(charset)); }); return Flux.concat(Flux.just(prefix), content, Flux.just(suffix));