Browse Source

Don't throw NPE when serving webjar directories

Prior to this change, serving resources with ResourceHttpRequestHandler
could result in NPE when requesting an existing folder located in a JAR.

This commit swallows those exceptions, as it is not possible to foresee
those cases without reading the actual resource. This result in a HTTP
200 response with a zero Content-Length instead of a HTTP 500 internal
exception.

Issue: SPR-13620
pull/897/merge
Brian Clozel 9 years ago
parent
commit
9334fabe26
  1. 3
      spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java
  2. 14
      spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java

3
spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java

@ -460,6 +460,9 @@ public class ResourceHttpRequestHandler extends WebContentGenerator @@ -460,6 +460,9 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
try {
StreamUtils.copy(in, response.getOutputStream());
}
catch (NullPointerException ex) {
// ignore, see SPR-13620
}
finally {
try {
in.close();

14
spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java

@ -478,6 +478,20 @@ public class ResourceHttpRequestHandlerTests { @@ -478,6 +478,20 @@ public class ResourceHttpRequestHandlerTests {
assertEquals(0, this.response.getContentLength());
}
// SPR-13620
@Test
public void writeContentInputStreamThrowingNullPointerException() throws Exception {
Resource resource = mock(Resource.class);
InputStream in = mock(InputStream.class);
given(resource.getInputStream()).willReturn(in);
given(in.read(any())).willThrow(NullPointerException.class);
this.handler.writeContent(this.response, resource);
assertEquals(200, this.response.getStatus());
assertEquals(0, this.response.getContentLength());
}
private long dateHeaderAsLong(String responseHeaderName) throws Exception {
return dateFormat.parse(this.response.getHeader(responseHeaderName)).getTime();

Loading…
Cancel
Save