-
Notifications
You must be signed in to change notification settings - Fork 38.8k
Closed
Labels
in: webIssues in web modules (web, webmvc, webflux, websocket)Issues in web modules (web, webmvc, webflux, websocket)type: bugA general bugA general bug
Milestone
Description
Affected version: spring-web-6.2.11
When requesting a resource that has a content length of 1000
bytes (and the server supports ranges in bytes)
using a range header Range: bytes=2000-5000
ends up in a 500
due to
java.lang.IllegalArgumentException: 'position' exceeds the resource length 1000
thrown in HttpRange.toResourceRegions(ranges, resource)
.
It should end up in a 416
(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE) which is expected eg.
https://developer.mozilla.org/de/docs/Web/HTTP/Reference/Status/416
Most likely it's good enough to just move the List regions calculation a bit up in code:
@Override
public Mono<Void> write(Publisher<? extends Resource> inputStream, @Nullable ResolvableType actualType,
ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request,
ServerHttpResponse response, Map<String, Object> hints) {
HttpHeaders headers = response.getHeaders();
headers.set(HttpHeaders.ACCEPT_RANGES, "bytes");
List<HttpRange> ranges;
try {
ranges = request.getHeaders().getRange();
// <---- HttpRange.toResourceRegions(...) ?!
}
catch (IllegalArgumentException ex) {
response.setStatusCode(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
return response.setComplete();
}
return Mono.from(inputStream).flatMap(resource -> {
if (ranges.isEmpty()) {
return writeResource(resource, elementType, mediaType, response, hints);
}
response.setStatusCode(HttpStatus.PARTIAL_CONTENT);
List<ResourceRegion> regions = HttpRange.toResourceRegions(ranges, resource); // <----
Metadata
Metadata
Assignees
Labels
in: webIssues in web modules (web, webmvc, webflux, websocket)Issues in web modules (web, webmvc, webflux, websocket)type: bugA general bugA general bug