Skip to content

Commit a19b51b

Browse files
committed
Handle invalid position in ResourceHttpMessageWriter
Closes gh-35536
1 parent fbdece6 commit a19b51b

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,16 +233,21 @@ public Mono<Void> write(Publisher<? extends Resource> inputStream, @Nullable Res
233233
ranges = request.getHeaders().getRange();
234234
}
235235
catch (IllegalArgumentException ex) {
236-
response.setStatusCode(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
237-
return response.setComplete();
236+
return handleInvalidRange(response);
238237
}
239238

240239
return Mono.from(inputStream).flatMap(resource -> {
241240
if (ranges.isEmpty()) {
242241
return writeResource(resource, elementType, mediaType, response, hints);
243242
}
244243
response.setStatusCode(HttpStatus.PARTIAL_CONTENT);
245-
List<ResourceRegion> regions = HttpRange.toResourceRegions(ranges, resource);
244+
List<ResourceRegion> regions;
245+
try {
246+
regions = HttpRange.toResourceRegions(ranges, resource);
247+
}
248+
catch (IllegalArgumentException ex) {
249+
return handleInvalidRange(response);
250+
}
246251
MediaType resourceMediaType = getResourceMediaType(mediaType, resource, hints);
247252
if (regions.size() == 1){
248253
ResourceRegion region = regions.get(0);
@@ -268,6 +273,11 @@ public Mono<Void> write(Publisher<? extends Resource> inputStream, @Nullable Res
268273
});
269274
}
270275

276+
private static Mono<Void> handleInvalidRange(ServerHttpResponse response) {
277+
response.setStatusCode(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
278+
return response.setComplete();
279+
}
280+
271281
private Mono<Void> writeSingleRegion(ResourceRegion region, ReactiveHttpOutputMessage message,
272282
Map<String, Object> hints) {
273283

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ void invalidRange() {
156156
assertThat(this.response.getStatusCode()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
157157
}
158158

159+
@Test // gh-35536
160+
void invalidRangePosition() {
161+
162+
testWrite(get("/").header(HttpHeaders.RANGE, "bytes=2000-5000").build());
163+
164+
assertThat(this.response.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES)).isEqualTo("bytes");
165+
assertThat(this.response.getStatusCode()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
166+
}
167+
159168

160169
private void testWrite(MockServerHttpRequest request) {
161170
Mono<Void> mono = this.writer.write(this.input, null, null, TEXT_PLAIN, request, this.response, HINTS);

0 commit comments

Comments
 (0)