Browse Source

Handle invalid position in ResourceHttpMessageWriter

Closes gh-35536
pull/35587/head
rstoyanchev 3 months ago
parent
commit
a19b51b7e0
  1. 16
      spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java
  2. 9
      spring-web/src/test/java/org/springframework/http/codec/ResourceHttpMessageWriterTests.java

16
spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java

@ -233,8 +233,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
ranges = request.getHeaders().getRange(); ranges = request.getHeaders().getRange();
} }
catch (IllegalArgumentException ex) { catch (IllegalArgumentException ex) {
response.setStatusCode(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE); return handleInvalidRange(response);
return response.setComplete();
} }
return Mono.from(inputStream).flatMap(resource -> { return Mono.from(inputStream).flatMap(resource -> {
@ -242,7 +241,13 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
return writeResource(resource, elementType, mediaType, response, hints); return writeResource(resource, elementType, mediaType, response, hints);
} }
response.setStatusCode(HttpStatus.PARTIAL_CONTENT); response.setStatusCode(HttpStatus.PARTIAL_CONTENT);
List<ResourceRegion> regions = HttpRange.toResourceRegions(ranges, resource); List<ResourceRegion> regions;
try {
regions = HttpRange.toResourceRegions(ranges, resource);
}
catch (IllegalArgumentException ex) {
return handleInvalidRange(response);
}
MediaType resourceMediaType = getResourceMediaType(mediaType, resource, hints); MediaType resourceMediaType = getResourceMediaType(mediaType, resource, hints);
if (regions.size() == 1){ if (regions.size() == 1){
ResourceRegion region = regions.get(0); ResourceRegion region = regions.get(0);
@ -268,6 +273,11 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
}); });
} }
private static Mono<Void> handleInvalidRange(ServerHttpResponse response) {
response.setStatusCode(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
return response.setComplete();
}
private Mono<Void> writeSingleRegion(ResourceRegion region, ReactiveHttpOutputMessage message, private Mono<Void> writeSingleRegion(ResourceRegion region, ReactiveHttpOutputMessage message,
Map<String, Object> hints) { Map<String, Object> hints) {

9
spring-web/src/test/java/org/springframework/http/codec/ResourceHttpMessageWriterTests.java

@ -156,6 +156,15 @@ class ResourceHttpMessageWriterTests {
assertThat(this.response.getStatusCode()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE); assertThat(this.response.getStatusCode()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
} }
@Test // gh-35536
void invalidRangePosition() {
testWrite(get("/").header(HttpHeaders.RANGE, "bytes=2000-5000").build());
assertThat(this.response.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES)).isEqualTo("bytes");
assertThat(this.response.getStatusCode()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
}
private void testWrite(MockServerHttpRequest request) { private void testWrite(MockServerHttpRequest request) {
Mono<Void> mono = this.writer.write(this.input, null, null, TEXT_PLAIN, request, this.response, HINTS); Mono<Void> mono = this.writer.write(this.input, null, null, TEXT_PLAIN, request, this.response, HINTS);

Loading…
Cancel
Save