Handle Resources beyond int length through Servlet 3.1's setContentLengthLong
Issue: SPR-14135
This commit is contained in:
@@ -21,6 +21,7 @@ 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;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
@@ -38,6 +39,7 @@ import org.springframework.http.converter.ResourceHttpMessageConverter;
|
||||
import org.springframework.http.server.ServletServerHttpRequest;
|
||||
import org.springframework.http.server.ServletServerHttpResponse;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.ResourceUtils;
|
||||
@@ -88,8 +90,13 @@ import org.springframework.web.servlet.support.WebContentGenerator;
|
||||
public class ResourceHttpRequestHandler extends WebContentGenerator
|
||||
implements HttpRequestHandler, InitializingBean, CorsConfigurationSource {
|
||||
|
||||
// Servlet 3.1 setContentLengthLong(long) available?
|
||||
private static final boolean contentLengthLongAvailable =
|
||||
ClassUtils.hasMethod(ServletResponse.class, "setContentLengthLong", long.class);
|
||||
|
||||
private static final Log logger = LogFactory.getLog(ResourceHttpRequestHandler.class);
|
||||
|
||||
|
||||
private final List<Resource> locations = new ArrayList<Resource>(4);
|
||||
|
||||
private final List<ResourceResolver> resourceResolvers = new ArrayList<ResourceResolver>(4);
|
||||
@@ -515,9 +522,17 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
|
||||
protected void setHeaders(HttpServletResponse response, Resource resource, MediaType mediaType) throws IOException {
|
||||
long length = resource.contentLength();
|
||||
if (length > Integer.MAX_VALUE) {
|
||||
throw new IOException("Resource content too long (beyond Integer.MAX_VALUE): " + resource);
|
||||
if (contentLengthLongAvailable) {
|
||||
response.setContentLengthLong(length);
|
||||
}
|
||||
else {
|
||||
response.setHeader(HttpHeaders.CONTENT_LENGTH, Long.toString(length));
|
||||
}
|
||||
}
|
||||
response.setContentLength((int) length);
|
||||
else {
|
||||
response.setContentLength((int) length);
|
||||
}
|
||||
|
||||
if (mediaType != null) {
|
||||
response.setContentType(mediaType.toString());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user