From 37bd51cf6d1d1a41d287a66504539b28fc8e4584 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 8 Apr 2016 15:54:24 +0200 Subject: [PATCH] Handle Resources beyond int length through Servlet 3.1's setContentLengthLong Issue: SPR-14135 --- build.gradle | 94 +++++++++---------- .../ResourceHttpMessageConverter.java | 16 +--- .../resource/ResourceHttpRequestHandler.java | 19 +++- 3 files changed, 65 insertions(+), 64 deletions(-) diff --git a/build.gradle b/build.gradle index bf3484bcca2..2afce28fcb0 100644 --- a/build.gradle +++ b/build.gradle @@ -744,52 +744,6 @@ project("spring-web") { } } -project("spring-websocket") { - description = "Spring WebSocket" - - dependencies { - compile(project(":spring-core")) - compile(project(":spring-context")) - compile(project(":spring-web")) - optional(project(":spring-messaging")) - optional(project(":spring-webmvc")) - optional("javax.servlet:javax.servlet-api:3.1.0") - optional("javax.websocket:javax.websocket-api:1.0") - optional("org.apache.tomcat:tomcat-websocket:${tomcatVersion}") { - exclude group: "org.apache.tomcat", module: "tomcat-websocket-api" - exclude group: "org.apache.tomcat", module: "tomcat-servlet-api" - } - optional("org.glassfish.tyrus:tyrus-spi:${tyrusVersion}") - optional("org.glassfish.tyrus:tyrus-core:${tyrusVersion}") - optional("org.glassfish.tyrus:tyrus-server:${tyrusVersion}") - optional("org.glassfish.tyrus:tyrus-container-servlet:${tyrusVersion}") - optional("org.eclipse.jetty:jetty-webapp:${jettyVersion}") { - exclude group: "javax.servlet", module: "javax.servlet" - } - optional("org.eclipse.jetty.websocket:websocket-server:${jettyVersion}") { - exclude group: "javax.servlet", module: "javax.servlet" - } - optional("org.eclipse.jetty.websocket:websocket-client:${jettyVersion}") - optional("org.eclipse.jetty:jetty-client:${jettyVersion}") - optional("io.undertow:undertow-core:${undertowVersion}") - optional("io.undertow:undertow-servlet:${undertowVersion}") { - exclude group: "org.jboss.spec.javax.servlet", module: "jboss-servlet-api_3.1_spec" - exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.2_spec" - } - optional("io.undertow:undertow-websockets-jsr:${undertowVersion}") { - exclude group: "org.jboss.spec.javax.websocket", module: "jboss-websocket-api_1.1_spec" - } - optional("com.fasterxml.jackson.core:jackson-databind:${jackson2Version}") - testCompile("org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}") - testCompile("org.apache.tomcat.embed:tomcat-embed-websocket:${tomcatVersion}") - testCompile("org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}") - testCompile("io.projectreactor:reactor-net:${reactorVersion}") - testCompile("io.netty:netty-all:${nettyVersion}") - testCompile("log4j:log4j:1.2.17") - testCompile("org.slf4j:slf4j-jcl:${slf4jVersion}") - } -} - project("spring-orm") { description = "Spring Object/Relational Mapping" @@ -874,7 +828,7 @@ project("spring-webmvc") { compile(files(project(":spring-core").objenesisRepackJar)) compile(project(":spring-expression")) compile(project(":spring-web")) - provided("javax.servlet:javax.servlet-api:3.0.1") + provided("javax.servlet:javax.servlet-api:3.1.0") optional(project(":spring-context-support")) // for Velocity support optional(project(":spring-oxm")) // for MarshallingView optional("javax.servlet.jsp:javax.servlet.jsp-api:2.2.1") @@ -993,6 +947,52 @@ project("spring-webmvc-portlet") { } } +project("spring-websocket") { + description = "Spring WebSocket" + + dependencies { + compile(project(":spring-core")) + compile(project(":spring-context")) + compile(project(":spring-web")) + optional(project(":spring-messaging")) + optional(project(":spring-webmvc")) + optional("javax.servlet:javax.servlet-api:3.1.0") + optional("javax.websocket:javax.websocket-api:1.0") + optional("org.apache.tomcat:tomcat-websocket:${tomcatVersion}") { + exclude group: "org.apache.tomcat", module: "tomcat-websocket-api" + exclude group: "org.apache.tomcat", module: "tomcat-servlet-api" + } + optional("org.glassfish.tyrus:tyrus-spi:${tyrusVersion}") + optional("org.glassfish.tyrus:tyrus-core:${tyrusVersion}") + optional("org.glassfish.tyrus:tyrus-server:${tyrusVersion}") + optional("org.glassfish.tyrus:tyrus-container-servlet:${tyrusVersion}") + optional("org.eclipse.jetty:jetty-webapp:${jettyVersion}") { + exclude group: "javax.servlet", module: "javax.servlet" + } + optional("org.eclipse.jetty.websocket:websocket-server:${jettyVersion}") { + exclude group: "javax.servlet", module: "javax.servlet" + } + optional("org.eclipse.jetty.websocket:websocket-client:${jettyVersion}") + optional("org.eclipse.jetty:jetty-client:${jettyVersion}") + optional("io.undertow:undertow-core:${undertowVersion}") + optional("io.undertow:undertow-servlet:${undertowVersion}") { + exclude group: "org.jboss.spec.javax.servlet", module: "jboss-servlet-api_3.1_spec" + exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.2_spec" + } + optional("io.undertow:undertow-websockets-jsr:${undertowVersion}") { + exclude group: "org.jboss.spec.javax.websocket", module: "jboss-websocket-api_1.1_spec" + } + optional("com.fasterxml.jackson.core:jackson-databind:${jackson2Version}") + testCompile("org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}") + testCompile("org.apache.tomcat.embed:tomcat-embed-websocket:${tomcatVersion}") + testCompile("org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}") + testCompile("io.projectreactor:reactor-net:${reactorVersion}") + testCompile("io.netty:netty-all:${nettyVersion}") + testCompile("log4j:log4j:1.2.17") + testCompile("org.slf4j:slf4j-jcl:${slf4jVersion}") + } +} + project("spring-test") { description = "Spring TestContext Framework" diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java index f7c9fe0279d..ce95b3a67da 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; - import javax.activation.FileTypeMap; import javax.activation.MimetypesFileTypeMap; @@ -108,9 +107,6 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter Integer.MAX_VALUE) { - throw new IOException("Resource content too long (beyond Integer.MAX_VALUE): " + resource); - } return (contentLength < 0 ? null : contentLength); } @@ -158,9 +154,7 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter ranges = resource.getHttpRanges(); HttpHeaders responseHeaders = outputMessage.getHeaders(); MediaType contentType = responseHeaders.getContentType(); @@ -168,14 +162,11 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter locations = new ArrayList(4); private final List resourceResolvers = new ArrayList(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()); }