Polish EncoderHttpMessageWriter Content-Type handling
This commit is contained in:
parent
ad91b94249
commit
91a75ed772
|
@ -49,6 +49,8 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
|
||||||
|
|
||||||
private final List<MediaType> mediaTypes;
|
private final List<MediaType> mediaTypes;
|
||||||
|
|
||||||
|
private final MediaType defaultMediaType;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an instance wrapping the given {@link Encoder}.
|
* Create an instance wrapping the given {@link Encoder}.
|
||||||
|
@ -57,6 +59,11 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
|
||||||
Assert.notNull(encoder, "Encoder is required");
|
Assert.notNull(encoder, "Encoder is required");
|
||||||
this.encoder = encoder;
|
this.encoder = encoder;
|
||||||
this.mediaTypes = MediaType.asMediaTypes(encoder.getEncodableMimeTypes());
|
this.mediaTypes = MediaType.asMediaTypes(encoder.getEncodableMimeTypes());
|
||||||
|
this.defaultMediaType = initDefaultMediaType(this.mediaTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MediaType initDefaultMediaType(List<MediaType> mediaTypes) {
|
||||||
|
return mediaTypes.stream().filter(MediaType::isConcrete).findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,23 +91,13 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
|
||||||
Map<String, Object> hints) {
|
Map<String, Object> hints) {
|
||||||
|
|
||||||
HttpHeaders headers = outputMessage.getHeaders();
|
HttpHeaders headers = outputMessage.getHeaders();
|
||||||
|
|
||||||
if (headers.getContentType() == null) {
|
if (headers.getContentType() == null) {
|
||||||
MediaType contentTypeToUse = mediaType;
|
MediaType fallback = this.defaultMediaType;
|
||||||
if (mediaType == null || mediaType.isWildcardType() || mediaType.isWildcardSubtype()) {
|
MediaType selected = useFallback(mediaType, fallback) ? fallback : mediaType;
|
||||||
contentTypeToUse = getDefaultContentType(elementType);
|
if (selected != null) {
|
||||||
}
|
selected = addDefaultCharset(selected, fallback);
|
||||||
else if (MediaType.APPLICATION_OCTET_STREAM.equals(mediaType)) {
|
headers.setContentType(selected);
|
||||||
MediaType contentType = getDefaultContentType(elementType);
|
|
||||||
contentTypeToUse = (contentType != null ? contentType : contentTypeToUse);
|
|
||||||
}
|
|
||||||
if (contentTypeToUse != null) {
|
|
||||||
if (contentTypeToUse.getCharset() == null) {
|
|
||||||
MediaType contentType = getDefaultContentType(elementType);
|
|
||||||
if (contentType != null && contentType.getCharset() != null) {
|
|
||||||
contentTypeToUse = new MediaType(contentTypeToUse, contentType.getCharset());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers.setContentType(contentTypeToUse);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,18 +107,17 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
|
||||||
outputMessage.writeAndFlushWith(body.map(Flux::just)) : outputMessage.writeWith(body));
|
outputMessage.writeAndFlushWith(body.map(Flux::just)) : outputMessage.writeWith(body));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the default content type for the given {@code ResolvableType}.
|
private static boolean useFallback(MediaType main, MediaType fallback) {
|
||||||
* Used when {@link #write} is called without a concrete content type.
|
return main == null || !main.isConcrete() ||
|
||||||
*
|
main.equals(MediaType.APPLICATION_OCTET_STREAM) && fallback != null;
|
||||||
* <p>By default returns the first of {@link Encoder#getEncodableMimeTypes()
|
}
|
||||||
* encodableMimeTypes} that is concrete({@link MediaType#isConcrete()}), if any.
|
|
||||||
*
|
private static MediaType addDefaultCharset(MediaType main, MediaType defaultType) {
|
||||||
* @param elementType the type of element for encoding
|
if (main.getCharset() == null && defaultType != null && defaultType.getCharset() != null) {
|
||||||
* @return the content type, or {@code null}
|
return new MediaType(main, defaultType.getCharset());
|
||||||
*/
|
}
|
||||||
protected MediaType getDefaultContentType(ResolvableType elementType) {
|
return main;
|
||||||
return this.mediaTypes.stream().filter(MediaType::isConcrete).findFirst().orElse(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,12 +66,6 @@ public class ResourceRegionHttpMessageWriterTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void defaultContentType() throws Exception {
|
|
||||||
assertEquals(MimeTypeUtils.APPLICATION_OCTET_STREAM,
|
|
||||||
this.writer.getDefaultContentType(ResolvableType.forClass(ResourceRegion.class)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void writableMediaTypes() throws Exception {
|
public void writableMediaTypes() throws Exception {
|
||||||
assertThat(this.writer.getWritableMediaTypes(),
|
assertThat(this.writer.getWritableMediaTypes(),
|
||||||
|
|
Loading…
Reference in New Issue