From 7dc3a5564873b0839d7b74b2d2eb5ed5de50ce4e Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 31 Mar 2021 11:46:58 +0100 Subject: [PATCH] Deferred buffer allocation in SSE message writer See gh-26746 --- .../codec/ServerSentEventHttpMessageWriter.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java index 6f54d9631b1..73befefb65b 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package org.springframework.http.codec; import java.nio.charset.StandardCharsets; import java.time.Duration; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -171,12 +170,14 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter) this.encoder).encodeValue(data, factory, dataType, mediaType, hints); - Hints.touchDataBuffer(buffer, hints, logger); - return Flux.just(factory.join(Arrays.asList( - encodeText(eventContent, mediaType, factory), - buffer, - encodeText("\n\n", mediaType, factory)))); + + return Flux.defer(() -> { + DataBuffer startBuffer = encodeText(eventContent, mediaType, factory); + DataBuffer endBuffer = encodeText("\n\n", mediaType, factory); + DataBuffer dataBuffer = ((Encoder) this.encoder).encodeValue(data, factory, dataType, mediaType, hints); + Hints.touchDataBuffer(dataBuffer, hints, logger); + return Flux.just(startBuffer, dataBuffer, endBuffer); + }); } private void writeField(String fieldName, Object fieldValue, StringBuilder sb) {