diff --git a/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java index af456989e0..5765fe218c 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java @@ -116,22 +116,13 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter { private Mono writeResource(Resource resource, ResolvableType type, @Nullable MediaType mediaType, ReactiveHttpOutputMessage message, Map hints) { - HttpHeaders headers = message.getHeaders(); - MediaType resourceMediaType = getResourceMediaType(mediaType, resource, hints); - headers.setContentType(resourceMediaType); - - if (headers.getContentLength() < 0) { - long length = lengthOf(resource); - if (length != -1) { - headers.setContentLength(length); - } - } + addHeaders(message, resource, mediaType, hints); return zeroCopy(resource, null, message, hints) .orElseGet(() -> { Mono input = Mono.just(resource); DataBufferFactory factory = message.bufferFactory(); - Flux body = this.encoder.encode(input, factory, type, resourceMediaType, hints); + Flux body = this.encoder.encode(input, factory, type, message.getHeaders().getContentType(), hints); if (logger.isDebugEnabled()) { body = body.doOnNext(buffer -> Hints.touchDataBuffer(buffer, hints, logger)); } @@ -139,6 +130,24 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter { }); } + /** + * Adds the default headers for the given resource to the given message. + * @since 6.0 + */ + public void addHeaders(ReactiveHttpOutputMessage message, Resource resource, @Nullable MediaType contentType, Map hints) { + HttpHeaders headers = message.getHeaders(); + MediaType resourceMediaType = getResourceMediaType(contentType, resource, hints); + headers.setContentType(resourceMediaType); + + if (headers.getContentLength() < 0) { + long length = lengthOf(resource); + if (length != -1) { + headers.setContentLength(length); + } + } + headers.set(HttpHeaders.ACCEPT_RANGES, "bytes"); + } + private static MediaType getResourceMediaType( @Nullable MediaType mediaType, Resource resource, Map hints) { diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java index 17aa290ca9..e49bdd2551 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java @@ -122,6 +122,14 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter