ResourceHttpRequestHandler sets "Accept-Ranges" header only once

Issue: SPR-14221
This commit is contained in:
Juergen Hoeller
2016-05-06 11:50:47 +02:00
parent 1b1aac9172
commit e5dbe12e85
2 changed files with 60 additions and 17 deletions

View File

@@ -20,7 +20,6 @@ import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
@@ -120,7 +119,7 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
/**
* Set a {@code List} of {@code Resource} paths to use as sources
* Set the {@code List} of {@code Resource} paths to use as sources
* for serving static resources.
*/
public void setLocations(List<Resource> locations) {
@@ -129,6 +128,10 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
this.locations.addAll(locations);
}
/**
* Return the {@code List} of {@code Resource} paths to use as sources
* for serving static resources.
*/
public List<Resource> getLocations() {
return this.locations;
}
@@ -173,12 +176,16 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
/**
* Configure the {@link ResourceHttpMessageConverter} to use.
* <p>By default a {@link ResourceHttpMessageConverter} will be configured.
* @since 4.3.0
* @since 4.3
*/
public void setResourceHttpMessageConverter(ResourceHttpMessageConverter resourceHttpMessageConverter) {
this.resourceHttpMessageConverter = resourceHttpMessageConverter;
}
/**
* Return the list of configured resource converters.
* @since 4.3
*/
public ResourceHttpMessageConverter getResourceHttpMessageConverter() {
return this.resourceHttpMessageConverter;
}
@@ -186,15 +193,18 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
/**
* Configure the {@link ResourceRegionHttpMessageConverter} to use.
* <p>By default a {@link ResourceRegionHttpMessageConverter} will be configured.
* @since 4.3.0
* @since 4.3
*/
public ResourceRegionHttpMessageConverter getResourceRegionHttpMessageConverter() {
return resourceRegionHttpMessageConverter;
public void setResourceRegionHttpMessageConverter(ResourceRegionHttpMessageConverter resourceRegionHttpMessageConverter) {
this.resourceRegionHttpMessageConverter = resourceRegionHttpMessageConverter;
}
public void setResourceRegionHttpMessageConverter(
ResourceRegionHttpMessageConverter resourceRegionHttpMessageConverter) {
this.resourceRegionHttpMessageConverter = resourceRegionHttpMessageConverter;
/**
* Return the list of configured resource region converters.
* @since 4.3
*/
public ResourceRegionHttpMessageConverter getResourceRegionHttpMessageConverter() {
return this.resourceRegionHttpMessageConverter;
}
/**
@@ -215,6 +225,10 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
this.contentNegotiationManager = contentNegotiationManager;
}
/**
* Return the specified content negotiation manager.
* @since 4.3
*/
public ContentNegotiationManager getContentNegotiationManager() {
return this.contentNegotiationManager;
}
@@ -227,6 +241,9 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
this.corsConfiguration = corsConfiguration;
}
/**
* Return the specified CORS configuration.
*/
@Override
public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
return this.corsConfiguration;
@@ -348,13 +365,12 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
}
ServletServerHttpResponse outputMessage = new ServletServerHttpResponse(response);
outputMessage.getHeaders().add(HttpHeaders.ACCEPT_RANGES, "bytes");
if (request.getHeader(HttpHeaders.RANGE) == null) {
setHeaders(response, resource, mediaType);
this.resourceHttpMessageConverter.write(resource, mediaType, outputMessage);
}
else {
response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
ServletServerHttpRequest inputMessage = new ServletServerHttpRequest(request);
try {
List<HttpRange> httpRanges = inputMessage.getHeaders().getRange();
@@ -364,12 +380,12 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
this.resourceRegionHttpMessageConverter.write(resourceRegion, mediaType, outputMessage);
}
else {
this.resourceRegionHttpMessageConverter
.write(HttpRange.toResourceRegions(httpRanges, resource), mediaType, outputMessage);
this.resourceRegionHttpMessageConverter.write(
HttpRange.toResourceRegions(httpRanges, resource), mediaType, outputMessage);
}
}
catch (IllegalArgumentException ex) {
response.addHeader("Content-Range", "bytes */" + resource.contentLength());
response.setHeader("Content-Range", "bytes */" + resource.contentLength());
response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
}
}