From 9334fabe26c94f6a4cb57e5e80587f33af783f79 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 29 Oct 2015 16:10:27 +0100 Subject: [PATCH] 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 --- .../resource/ResourceHttpRequestHandler.java | 3 +++ .../resource/ResourceHttpRequestHandlerTests.java | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java index 25c9184e0fc..d89bb8fb8c2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java @@ -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(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java index 176ac6bc041..bb5f502231a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java @@ -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();