From 88379e2aa3c3408b787ceae0e0b127350834f29c Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 20 Jun 2014 12:15:10 +0100 Subject: [PATCH] Check if response is committed before tryying to forward It' sthe best we can do, but the container seems to still use our error page (it just can't have the status code that we asked for). Fixes gh-748 --- .../boot/context/web/ErrorPageFilter.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/context/web/ErrorPageFilter.java b/spring-boot/src/main/java/org/springframework/boot/context/web/ErrorPageFilter.java index 8ce25e3e33..e92dbd67a2 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/web/ErrorPageFilter.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/web/ErrorPageFilter.java @@ -30,6 +30,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.boot.context.embedded.AbstractConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.boot.context.embedded.ErrorPage; @@ -55,6 +57,8 @@ import org.springframework.stereotype.Component; class ErrorPageFilter extends AbstractConfigurableEmbeddedServletContainer implements Filter, NonEmbeddedServletContainerFactory { + private static Log logger = LogFactory.getLog(ErrorPageFilter.class); + // From RequestDispatcher but not referenced to remain compatible with Servlet 2.5 private static final String ERROR_EXCEPTION = "javax.servlet.error.exception"; @@ -132,7 +136,18 @@ class ErrorPageFilter extends AbstractConfigurableEmbeddedServletContainer imple request.setAttribute(ERROR_EXCEPTION, ex); request.setAttribute(ERROR_EXCEPTION_TYPE, type.getName()); wrapped.sendError(500, ex.getMessage()); - request.getRequestDispatcher(errorPath).forward(request, response); + if (!wrapped.isCommitted()) { + wrapped.reset(); + request.getRequestDispatcher(errorPath).forward(request, wrapped); + } + else { + String message = "Cannot forward to error page for" + + request.getRequestURI() + + " (response is committed), so this response may have the wrong status code"; + logger.error(message); + // User might see the error page without all the data here but the exception + // isn't going to help anyone (and it's already been logged) + } } private String getErrorPath(Map map, Integer status) {