From 9b0c2cca9562400f43e002e4ec86366696aeeb99 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 8 Feb 2021 15:40:47 +0100 Subject: [PATCH] Ensure StringDecoder supports multiline delimiters This commit makes sure the StringDecoder supports stripping off multi-line delimiters, such as \r\n. Specifically, we ensure that the delimiter is stripped from the joined buffer. Closes gh-26511 --- .../core/codec/StringDecoder.java | 12 ++++++++---- .../core/codec/StringDecoderTests.java | 19 +++++++++++++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java b/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java index 48c0da676997..e805414c1309 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java +++ b/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java @@ -157,16 +157,20 @@ private Collection processDataBuffer( int startIndex = buffer.readPosition(); int length = (endIndex - startIndex + 1); DataBuffer slice = buffer.retainedSlice(startIndex, length); - if (this.stripDelimiter) { - slice.writePosition(slice.writePosition() - matcher.delimiter().length); - } result = (result != null ? result : new ArrayList<>()); if (chunks.isEmpty()) { + if (this.stripDelimiter) { + slice.writePosition(slice.writePosition() - matcher.delimiter().length); + } result.add(slice); } else { chunks.add(slice); - result.add(buffer.factory().join(chunks)); + DataBuffer joined = buffer.factory().join(chunks); + if (this.stripDelimiter) { + joined.writePosition(joined.writePosition() - matcher.delimiter().length); + } + result.add(joined); chunks.clear(); } buffer.readPosition(endIndex + 1); diff --git a/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java b/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java index a41e1fdc6297..ade19bdfd46e 100644 --- a/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java +++ b/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java @@ -125,10 +125,10 @@ void decodeNewLine() { ); testDecode(input, String.class, step -> step - .expectNext("") + .expectNext("").as("1st") .expectNext("abc") .expectNext("defghi") - .expectNext("") + .expectNext("").as("2nd") .expectNext("jklmno") .expectNext("pqr") .expectNext("stuvwxyz") @@ -136,6 +136,21 @@ void decodeNewLine() { .verify()); } + @Test + void decodeNewlinesAcrossBuffers() { + Flux input = Flux.just( + stringBuffer("\r"), + stringBuffer("\n"), + stringBuffer("xyz") + ); + + testDecode(input, String.class, step -> step + .expectNext("") + .expectNext("xyz") + .expectComplete() + .verify()); + } + @Test void maxInMemoryLimit() { Flux input = Flux.just(