Skip to content

Commit 71f9a84

Browse files
committed
Fix releasing bug in StringDecoder
This commit fixes an issue in StringDecoder, where, if the buffer did not contain any delimiters, it was released before it was relayed to any subscribers. Closes gh-29119
1 parent 2687de0 commit 71f9a84

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,14 @@ private byte[][] getDelimiterBytes(@Nullable MimeType mimeType) {
143143
private Collection<DataBuffer> processDataBuffer(
144144
DataBuffer buffer, DataBufferUtils.Matcher matcher, LimitedDataBufferList chunks) {
145145

146+
boolean release = true;
146147
try {
147148
List<DataBuffer> result = null;
148149
do {
149150
int endIndex = matcher.match(buffer);
150151
if (endIndex == -1) {
151152
chunks.add(buffer);
152-
DataBufferUtils.retain(buffer); // retain after add (may raise DataBufferLimitException)
153+
release = false;
153154
break;
154155
}
155156
DataBuffer split = buffer.split(endIndex + 1);
@@ -177,7 +178,9 @@ private Collection<DataBuffer> processDataBuffer(
177178
return (result != null ? result : Collections.emptyList());
178179
}
179180
finally {
180-
DataBufferUtils.release(buffer);
181+
if (release) {
182+
DataBufferUtils.release(buffer);
183+
}
181184
}
182185
}
183186

spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,26 @@ void malformedResponseChunksOnEntityWithBody(ClientHttpConnector connector) {
12581258
.verify();
12591259
}
12601260

1261+
@ParameterizedWebClientTest
1262+
void retrieveTextDecodedToFlux(ClientHttpConnector connector) {
1263+
startServer(connector);
1264+
1265+
prepareResponse(response -> response
1266+
.setHeader("Content-Type", "text/plain")
1267+
.setBody("Hey now"));
1268+
1269+
Flux<String> result = this.webClient.get()
1270+
.uri("/")
1271+
.accept(MediaType.TEXT_PLAIN)
1272+
.retrieve()
1273+
.bodyToFlux(String.class);
1274+
1275+
StepVerifier.create(result)
1276+
.expectNext("Hey now")
1277+
.expectComplete()
1278+
.verify(Duration.ofSeconds(3));
1279+
}
1280+
12611281
private <T> Mono<T> doMalformedChunkedResponseTest(
12621282
ClientHttpConnector connector, Function<ResponseSpec, Mono<T>> handler) {
12631283

0 commit comments

Comments
 (0)