Handle Resources beyond int length through Servlet 3.1's setContentLengthLong

Issue: SPR-14135
This commit is contained in:
Juergen Hoeller
2016-04-08 15:54:24 +02:00
parent 463c8f149d
commit 37bd51cf6d
3 changed files with 65 additions and 64 deletions

View File

@@ -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());
}