diff --git a/spring-web-reactive/src/main/java/org/springframework/http/converter/reactive/CodecHttpMessageConverter.java b/spring-web-reactive/src/main/java/org/springframework/http/converter/reactive/CodecHttpMessageConverter.java index 1bb4400df4..02a9cf7c71 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/converter/reactive/CodecHttpMessageConverter.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/converter/reactive/CodecHttpMessageConverter.java @@ -132,14 +132,22 @@ public class CodecHttpMessageConverter implements HttpMessageConverter { if (this.encoder == null) { return Mono.error(new IllegalStateException("No decoder set")); } + HttpHeaders headers = outputMessage.getHeaders(); if (headers.getContentType() == null) { MediaType contentTypeToUse = contentType; if (contentType == null || contentType.isWildcardType() || contentType.isWildcardSubtype()) { contentTypeToUse = getDefaultContentType(type); } - headers.setContentType(contentTypeToUse); + else if (MediaType.APPLICATION_OCTET_STREAM.equals(contentType)) { + MediaType mediaType = getDefaultContentType(type); + contentTypeToUse = (mediaType != null ? mediaType : contentTypeToUse); + } + if (contentTypeToUse != null) { + headers.setContentType(contentTypeToUse); + } } + DataBufferFactory bufferFactory = outputMessage.bufferFactory(); Flux body = this.encoder.encode(inputStream, bufferFactory, type, contentType); return outputMessage.writeWith(body); diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageConverterResultHandlerTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageConverterResultHandlerTests.java index 3f66528315..e022bbeee1 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageConverterResultHandlerTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageConverterResultHandlerTests.java @@ -48,6 +48,7 @@ import org.springframework.core.convert.support.GenericConversionService; import org.springframework.core.convert.support.ReactiveStreamsToCompletableFutureConverter; import org.springframework.core.convert.support.ReactiveStreamsToRxJava1Converter; import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.buffer.support.DataBufferTestUtils; import org.springframework.http.HttpMethod; @@ -90,16 +91,12 @@ public class MessageConverterResultHandlerTests { @Test // SPR-12894 - @Ignore // GH # 121 public void useDefaultContentType() throws Exception { - Object body = new ByteArrayResource("body".getBytes("UTF-8")); + Resource body = new ClassPathResource("logo.png", getClass()); ResolvableType bodyType = ResolvableType.forType(Resource.class); this.resultHandler.writeBody(this.exchange, body, bodyType).block(Duration.ofSeconds(5)); - assertEquals("image/jpeg", this.response.getHeaders().getFirst("Content-Type")); - TestSubscriber.subscribe(this.response.getBody()) - .assertValuesWith(buf -> assertEquals("body", - DataBufferTestUtils.dumpString(buf, Charset.forName("UTF-8")))); + assertEquals("image/x-png", this.response.getHeaders().getFirst("Content-Type")); } @Test diff --git a/spring-web-reactive/src/test/resources/org/springframework/web/reactive/result/method/annotation/logo.png b/spring-web-reactive/src/test/resources/org/springframework/web/reactive/result/method/annotation/logo.png new file mode 100644 index 0000000000..10cc93fbcf Binary files /dev/null and b/spring-web-reactive/src/test/resources/org/springframework/web/reactive/result/method/annotation/logo.png differ