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,8 +116,27 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter { private Mono writeResource(Resource resource, ResolvableType type, @Nullable MediaType mediaType, ReactiveHttpOutputMessage message, Map hints) { + 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, message.getHeaders().getContentType(), hints); + if (logger.isDebugEnabled()) { + body = body.doOnNext(buffer -> Hints.touchDataBuffer(buffer, hints, logger)); + } + return message.writeWith(body); + }); + } + + /** + * 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(mediaType, resource, hints); + MediaType resourceMediaType = getResourceMediaType(contentType, resource, hints); headers.setContentType(resourceMediaType); if (headers.getContentLength() < 0) { @@ -126,17 +145,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter { headers.setContentLength(length); } } - - 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); - if (logger.isDebugEnabled()) { - body = body.doOnNext(buffer -> Hints.touchDataBuffer(buffer, hints, logger)); - } - return message.writeWith(body); - }); + headers.set(HttpHeaders.ACCEPT_RANGES, "bytes"); } private static MediaType getResourceMediaType( 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