diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java index afb9975c7bf..acf32e72af0 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java @@ -1346,6 +1346,7 @@ public class DispatcherServlet extends FrameworkServlet { // leaving the other response headers in place. try { response.setHeader(HttpHeaders.CONTENT_TYPE, null); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, null); response.resetBuffer(); } catch (IllegalStateException illegalStateException) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java index 0ba2140873b..3ffd20ccda3 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java @@ -924,8 +924,8 @@ class DispatcherServletTests { assertThat(response.getHeader("Test-Header")).isEqualTo("spring"); } - @Test - void shouldResetContentTypeIfNotCommitted() throws Exception { + @Test // gh-34366, gh-35116 + void shouldResetContentHeadersIfNotCommitted() throws Exception { StaticWebApplicationContext context = new StaticWebApplicationContext(); context.setServletContext(getServletContext()); context.registerSingleton("/error", ErrorController.class); @@ -934,11 +934,15 @@ class DispatcherServletTests { MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "GET", "/error"); MockHttpServletResponse response = new MockHttpServletResponse(); - assertThatThrownBy(() -> servlet.service(request, response)).isInstanceOf(ServletException.class) + + assertThatThrownBy(() -> servlet.service(request, response)) + .isInstanceOf(ServletException.class) .hasCauseInstanceOf(IllegalArgumentException.class); + assertThat(response.getContentAsByteArray()).isEmpty(); assertThat(response.getStatus()).isEqualTo(400); assertThat(response.getHeaderNames()).doesNotContain(HttpHeaders.CONTENT_TYPE); + assertThat(response.getHeaderNames()).doesNotContain(HttpHeaders.CONTENT_DISPOSITION); } @@ -994,6 +998,7 @@ class DispatcherServletTests { response.setStatus(400); response.setHeader("Test-Header", "spring"); response.addHeader("Content-Type", "application/json"); + response.addHeader("Content-Disposition", "attachment; filename=\"report.txt\""); if (request.getAttribute("commit") != null) { response.flushBuffer(); }