mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-10-01 03:39:05 +00:00
Handle invalid position in ResourceHttpMessageWriter
Closes gh-35536
This commit is contained in:
+13
-3
@@ -233,8 +233,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
|
||||
ranges = request.getHeaders().getRange();
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
response.setStatusCode(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||
return response.setComplete();
|
||||
return handleInvalidRange(response);
|
||||
}
|
||||
|
||||
return Mono.from(inputStream).flatMap(resource -> {
|
||||
@@ -242,7 +241,13 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
|
||||
return writeResource(resource, elementType, mediaType, response, hints);
|
||||
}
|
||||
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);
|
||||
if (regions.size() == 1){
|
||||
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,
|
||||
Map<String, Object> hints) {
|
||||
|
||||
|
||||
+9
@@ -156,6 +156,15 @@ class ResourceHttpMessageWriterTests {
|
||||
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) {
|
||||
Mono<Void> mono = this.writer.write(this.input, null, null, TEXT_PLAIN, request, this.response, HINTS);
|
||||
|
||||
Reference in New Issue
Block a user