diff --git a/spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java index e6d9d09be8..c5e4d3d32b 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java @@ -181,7 +181,7 @@ public abstract class AbstractCodecConfigurer { /** * A registry and a factory for built-in HTTP message readers and writers. */ - public static class DefaultCodecConfigurer { + public abstract static class DefaultCodecConfigurer { private boolean suppressed = false; @@ -280,13 +280,9 @@ public abstract class AbstractCodecConfigurer { } - protected void addStringReaderTextOnlyTo(List> result) { - addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true))); - } + protected abstract void addStringReaderTextOnlyTo(List> result); - protected void addStringReaderTo(List> result) { - addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); - } + protected abstract void addStringReaderTo(List> result); protected void addStringWriterTextPlainOnlyTo(List> result) { addWriterTo(result, () -> new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly())); diff --git a/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java index f224524088..083e215ea7 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java @@ -18,6 +18,7 @@ package org.springframework.http.codec; import java.util.List; import org.springframework.core.codec.Decoder; +import org.springframework.core.codec.StringDecoder; import org.springframework.http.codec.json.Jackson2JsonDecoder; /** @@ -79,6 +80,14 @@ public class ClientCodecConfigurer extends AbstractCodecConfigurer { // Internal methods for building a list of default readers or writers... + protected void addStringReaderTextOnlyTo(List> result) { + addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(false))); + } + + protected void addStringReaderTo(List> result) { + addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(false))); + } + private void addServerSentEventReaderTo(List> result) { addReaderTo(result, () -> findReader(ServerSentEventHttpMessageReader.class, () -> { Decoder decoder = null; diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java index 3302cf37f9..f0356d4304 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java @@ -18,6 +18,7 @@ package org.springframework.http.codec; import java.util.List; import org.springframework.core.codec.Encoder; +import org.springframework.core.codec.StringDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; /** @@ -78,6 +79,14 @@ public class ServerCodecConfigurer extends AbstractCodecConfigurer { // Internal methods for building a list of default readers or writers... + protected void addStringReaderTextOnlyTo(List> result) { + addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true))); + } + + protected void addStringReaderTo(List> result) { + addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); + } + private void addServerSentEventWriterTo(List> result) { addWriterTo(result, () -> findWriter(ServerSentEventHttpMessageWriter.class, () -> { Encoder encoder = null; diff --git a/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java index ac13471892..a32a24b22c 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java @@ -15,11 +15,16 @@ */ package org.springframework.http.codec; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; +import reactor.core.publisher.Flux; +import org.springframework.core.ResolvableType; import org.springframework.core.codec.ByteArrayDecoder; import org.springframework.core.codec.ByteArrayEncoder; import org.springframework.core.codec.ByteBufferDecoder; @@ -31,6 +36,7 @@ import org.springframework.core.codec.Decoder; import org.springframework.core.codec.Encoder; import org.springframework.core.codec.ResourceDecoder; import org.springframework.core.codec.StringDecoder; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.MediaType; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; @@ -112,10 +118,17 @@ public class ClientCodecConfigurerTests { return ((EncoderHttpMessageWriter) writer).getEncoder(); } + @SuppressWarnings("unchecked") private void assertStringDecoder(Decoder decoder, boolean textOnly) { assertEquals(StringDecoder.class, decoder.getClass()); assertTrue(decoder.canDecode(forClass(String.class), MimeTypeUtils.TEXT_PLAIN)); assertEquals(!textOnly, decoder.canDecode(forClass(String.class), MediaType.TEXT_EVENT_STREAM)); + + Flux decoded = (Flux) decoder.decode( + Flux.just(new DefaultDataBufferFactory().wrap("line1\nline2".getBytes(StandardCharsets.UTF_8))), + ResolvableType.forClass(String.class), MimeTypeUtils.TEXT_PLAIN, Collections.emptyMap()); + + assertEquals(Collections.singletonList("line1\nline2"), decoded.collectList().block(Duration.ZERO)); } private void assertStringEncoder(Encoder encoder, boolean textOnly) { diff --git a/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java index 8c57c69f2f..8fae700705 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java @@ -282,7 +282,19 @@ public class CodecConfigurerTests { private static class TestCodecConfigurer extends AbstractCodecConfigurer { private TestCodecConfigurer() { - super(new DefaultCodecConfigurer()); + super(new TestDefaultCodecConfigurer()); + } + + + private static class TestDefaultCodecConfigurer extends DefaultCodecConfigurer { + + protected void addStringReaderTextOnlyTo(List> result) { + addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true))); + } + + protected void addStringReaderTo(List> result) { + addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); + } } } diff --git a/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java index d98853b215..2f8f31f915 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java @@ -15,11 +15,17 @@ */ 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.concurrent.atomic.AtomicInteger; import org.junit.Test; +import reactor.core.publisher.Flux; +import org.springframework.core.ResolvableType; import org.springframework.core.codec.ByteArrayDecoder; import org.springframework.core.codec.ByteArrayEncoder; import org.springframework.core.codec.ByteBufferDecoder; @@ -31,6 +37,7 @@ import org.springframework.core.codec.Decoder; import org.springframework.core.codec.Encoder; import org.springframework.core.codec.ResourceDecoder; import org.springframework.core.codec.StringDecoder; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.MediaType; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; @@ -112,10 +119,17 @@ public class ServerCodecConfigurerTests { return ((EncoderHttpMessageWriter) writer).getEncoder(); } + @SuppressWarnings("unchecked") private void assertStringDecoder(Decoder decoder, boolean textOnly) { assertEquals(StringDecoder.class, decoder.getClass()); assertTrue(decoder.canDecode(forClass(String.class), MimeTypeUtils.TEXT_PLAIN)); assertEquals(!textOnly, decoder.canDecode(forClass(String.class), MediaType.TEXT_EVENT_STREAM)); + + Flux flux = (Flux) decoder.decode( + Flux.just(new DefaultDataBufferFactory().wrap("line1\nline2".getBytes(StandardCharsets.UTF_8))), + ResolvableType.forClass(String.class), MimeTypeUtils.TEXT_PLAIN, Collections.emptyMap()); + + assertEquals(Arrays.asList("line1\n", "line2"), flux.collectList().block(Duration.ZERO)); } private void assertStringEncoder(Encoder encoder, boolean textOnly) {