Merge branch '1.5.x'

pull/12762/head
Andy Wilkinson 7 years ago
commit 7b39cdd5c4

@ -17,6 +17,7 @@
package org.springframework.boot.web.servlet.support; package org.springframework.boot.web.servlet.support;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -24,6 +25,7 @@ import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; import javax.servlet.FilterConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -311,11 +313,15 @@ public class ErrorPageFilter implements Filter, ErrorPageRegistry {
@Override @Override
public void flushBuffer() throws IOException { public void flushBuffer() throws IOException {
sendErrorIfNecessary();
super.flushBuffer();
}
private void sendErrorIfNecessary() throws IOException {
if (this.hasErrorToSend && !isCommitted()) { if (this.hasErrorToSend && !isCommitted()) {
((HttpServletResponse) getResponse()).sendError(this.status, ((HttpServletResponse) getResponse()).sendError(this.status,
this.message); this.message);
} }
super.flushBuffer();
} }
public String getMessage() { public String getMessage() {
@ -326,6 +332,19 @@ public class ErrorPageFilter implements Filter, ErrorPageRegistry {
return this.hasErrorToSend; return this.hasErrorToSend;
} }
@Override
public PrintWriter getWriter() throws IOException {
sendErrorIfNecessary();
return super.getWriter();
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
sendErrorIfNecessary();
return super.getOutputStream();
}
} }
} }

@ -521,6 +521,22 @@ public class ErrorPageFilterTests {
assertThat(this.response.getForwardedUrl()).isEqualTo("/500"); assertThat(this.response.getForwardedUrl()).isEqualTo("/500");
} }
@Test
public void whenErrorIsSentAndWriterIsFlushedErrorIsSentToTheClient()
throws Exception {
this.chain = new MockFilterChain() {
@Override
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
((HttpServletResponse) response).sendError(400);
response.getWriter().flush();
super.doFilter(request, response);
}
};
this.filter.doFilter(this.request, this.response, this.chain);
assertThat(this.response.getStatus()).isEqualTo(400);
}
private void setUpAsyncDispatch() throws Exception { private void setUpAsyncDispatch() throws Exception {
this.request.setAsyncSupported(true); this.request.setAsyncSupported(true);
this.request.setAsyncStarted(true); this.request.setAsyncStarted(true);

Loading…
Cancel
Save