CodecConfigurer implementation refactoring
Backport of 9d65830133
See gh-24201
This commit is contained in:
@@ -22,7 +22,6 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.junit.Test;
|
||||
import reactor.core.publisher.Flux;
|
||||
@@ -45,6 +44,7 @@ import org.springframework.http.codec.ClientCodecConfigurer;
|
||||
import org.springframework.http.codec.DecoderHttpMessageReader;
|
||||
import org.springframework.http.codec.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.codec.FormHttpMessageReader;
|
||||
import org.springframework.http.codec.FormHttpMessageWriter;
|
||||
import org.springframework.http.codec.HttpMessageReader;
|
||||
import org.springframework.http.codec.HttpMessageWriter;
|
||||
import org.springframework.http.codec.ResourceHttpMessageWriter;
|
||||
@@ -119,12 +119,45 @@ public class ClientCodecConfigurerTests {
|
||||
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder();
|
||||
this.configurer.defaultCodecs().jackson2JsonDecoder(decoder);
|
||||
|
||||
assertSame(decoder, this.configurer.getReaders().stream()
|
||||
.filter(reader -> ServerSentEventHttpMessageReader.class.equals(reader.getClass()))
|
||||
.map(reader -> (ServerSentEventHttpMessageReader) reader)
|
||||
.findFirst()
|
||||
.map(ServerSentEventHttpMessageReader::getDecoder)
|
||||
.filter(e -> e == decoder).orElse(null));
|
||||
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
|
||||
assertSame(decoder, findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void maxInMemorySize() {
|
||||
int size = 99;
|
||||
this.configurer.defaultCodecs().maxInMemorySize(size);
|
||||
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
|
||||
assertEquals(12, readers.size());
|
||||
assertEquals(size, ((ByteArrayDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((ByteBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((DataBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((ResourceDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((ProtobufDecoder) getNextDecoder(readers)).getMaxMessageSize());
|
||||
assertEquals(size, ((FormHttpMessageReader) nextReader(readers)).getMaxInMemorySize());
|
||||
|
||||
assertEquals(size, ((Jackson2JsonDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((Jackson2SmileDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
assertEquals(size, ((Jaxb2XmlDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
|
||||
ServerSentEventHttpMessageReader reader = (ServerSentEventHttpMessageReader) nextReader(readers);
|
||||
assertEquals(size, ((Jackson2JsonDecoder) reader.getDecoder()).getMaxInMemorySize());
|
||||
|
||||
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void enableLoggingRequestDetails() {
|
||||
this.configurer.defaultCodecs().enableLoggingRequestDetails(true);
|
||||
|
||||
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
|
||||
MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
|
||||
assertTrue(multipartWriter.isEnableLoggingRequestDetails());
|
||||
|
||||
FormHttpMessageWriter formWriter = (FormHttpMessageWriter) multipartWriter.getFormWriter();
|
||||
assertNotNull(formWriter);
|
||||
assertTrue(formWriter.isEnableLoggingRequestDetails());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -138,35 +171,19 @@ public class ClientCodecConfigurerTests {
|
||||
|
||||
// Clone has the customizations
|
||||
|
||||
Decoder<?> sseDecoder = clone.getReaders().stream()
|
||||
.filter(reader -> reader instanceof ServerSentEventHttpMessageReader)
|
||||
.map(reader -> ((ServerSentEventHttpMessageReader) reader).getDecoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
List<HttpMessageWriter<?>> multipartWriters = clone.getWriters().stream()
|
||||
.filter(writer -> writer instanceof MultipartHttpMessageWriter)
|
||||
.flatMap(writer -> ((MultipartHttpMessageWriter) writer).getPartWriters().stream())
|
||||
.collect(Collectors.toList());
|
||||
Decoder<?> sseDecoder = findCodec(clone.getReaders(), ServerSentEventHttpMessageReader.class).getDecoder();
|
||||
List<HttpMessageWriter<?>> writers = findCodec(clone.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
|
||||
|
||||
assertSame(jackson2Decoder, sseDecoder);
|
||||
assertEquals(2, multipartWriters.size());
|
||||
assertEquals(2, writers.size());
|
||||
|
||||
// Original does not have the customizations
|
||||
|
||||
sseDecoder = this.configurer.getReaders().stream()
|
||||
.filter(reader -> reader instanceof ServerSentEventHttpMessageReader)
|
||||
.map(reader -> ((ServerSentEventHttpMessageReader) reader).getDecoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
multipartWriters = this.configurer.getWriters().stream()
|
||||
.filter(writer -> writer instanceof MultipartHttpMessageWriter)
|
||||
.flatMap(writer -> ((MultipartHttpMessageWriter) writer).getPartWriters().stream())
|
||||
.collect(Collectors.toList());
|
||||
sseDecoder = findCodec(this.configurer.getReaders(), ServerSentEventHttpMessageReader.class).getDecoder();
|
||||
writers = findCodec(this.configurer.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
|
||||
|
||||
assertNotSame(jackson2Decoder, sseDecoder);
|
||||
assertEquals(10, multipartWriters.size());
|
||||
assertEquals(10, writers.size());
|
||||
}
|
||||
|
||||
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
|
||||
@@ -175,12 +192,21 @@ public class ClientCodecConfigurerTests {
|
||||
return ((DecoderHttpMessageReader<?>) reader).getDecoder();
|
||||
}
|
||||
|
||||
private HttpMessageReader<?> nextReader(List<HttpMessageReader<?>> readers) {
|
||||
return readers.get(this.index.getAndIncrement());
|
||||
}
|
||||
|
||||
private Encoder<?> getNextEncoder(List<HttpMessageWriter<?>> writers) {
|
||||
HttpMessageWriter<?> writer = writers.get(this.index.getAndIncrement());
|
||||
assertEquals(EncoderHttpMessageWriter.class, writer.getClass());
|
||||
return ((EncoderHttpMessageWriter<?>) writer).getEncoder();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> T findCodec(List<?> codecs, Class<T> type) {
|
||||
return (T) codecs.stream().filter(type::isInstance).findFirst().get();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void assertStringDecoder(Decoder<?> decoder, boolean textOnly) {
|
||||
assertEquals(StringDecoder.class, decoder.getClass());
|
||||
|
||||
@@ -153,6 +153,20 @@ public class ServerCodecConfigurerTests {
|
||||
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void enableRequestLoggingDetails() {
|
||||
this.configurer.defaultCodecs().enableLoggingRequestDetails(true);
|
||||
|
||||
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
|
||||
assertTrue(findCodec(readers, FormHttpMessageReader.class).isEnableLoggingRequestDetails());
|
||||
|
||||
MultipartHttpMessageReader multipartReader = findCodec(readers, MultipartHttpMessageReader.class);
|
||||
assertTrue(multipartReader.isEnableLoggingRequestDetails());
|
||||
|
||||
SynchronossPartHttpMessageReader reader = (SynchronossPartHttpMessageReader) multipartReader.getPartReader();
|
||||
assertTrue(reader.isEnableLoggingRequestDetails());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cloneConfigurer() {
|
||||
ServerCodecConfigurer clone = this.configurer.clone();
|
||||
@@ -164,37 +178,22 @@ public class ServerCodecConfigurerTests {
|
||||
|
||||
// Clone has the customizations
|
||||
|
||||
HttpMessageReader<?> actualReader = clone.getReaders().stream()
|
||||
.filter(r -> r instanceof MultipartHttpMessageReader)
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
Encoder<?> actualEncoder = clone.getWriters().stream()
|
||||
.filter(writer -> writer instanceof ServerSentEventHttpMessageWriter)
|
||||
.map(writer -> ((ServerSentEventHttpMessageWriter) writer).getEncoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
HttpMessageReader<?> actualReader =
|
||||
findCodec(clone.getReaders(), MultipartHttpMessageReader.class);
|
||||
|
||||
ServerSentEventHttpMessageWriter actualWriter =
|
||||
findCodec(clone.getWriters(), ServerSentEventHttpMessageWriter.class);
|
||||
|
||||
assertSame(reader, actualReader);
|
||||
assertSame(encoder, actualEncoder);
|
||||
assertSame(encoder, actualWriter.getEncoder());
|
||||
|
||||
// Original does not have the customizations
|
||||
|
||||
actualReader = this.configurer.getReaders().stream()
|
||||
.filter(r -> r instanceof MultipartHttpMessageReader)
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
actualEncoder = this.configurer.getWriters().stream()
|
||||
.filter(writer -> writer instanceof ServerSentEventHttpMessageWriter)
|
||||
.map(writer -> ((ServerSentEventHttpMessageWriter) writer).getEncoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
actualReader = findCodec(this.configurer.getReaders(), MultipartHttpMessageReader.class);
|
||||
actualWriter = findCodec(this.configurer.getWriters(), ServerSentEventHttpMessageWriter.class);
|
||||
|
||||
assertNotSame(reader, actualReader);
|
||||
assertNotSame(encoder, actualEncoder);
|
||||
assertNotSame(encoder, actualWriter.getEncoder());
|
||||
}
|
||||
|
||||
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
|
||||
@@ -213,6 +212,11 @@ public class ServerCodecConfigurerTests {
|
||||
return ((EncoderHttpMessageWriter<?>) writer).getEncoder();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> T findCodec(List<?> codecs, Class<T> type) {
|
||||
return (T) codecs.stream().filter(type::isInstance).findFirst().get();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void assertStringDecoder(Decoder<?> decoder, boolean textOnly) {
|
||||
assertEquals(StringDecoder.class, decoder.getClass());
|
||||
|
||||
Reference in New Issue
Block a user