From b9004977d36d3bb59c373beae6afdf857189fc92 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 1 Aug 2020 12:47:23 +0200 Subject: [PATCH] Reset charset field in MockHttpServletResponse Prior to this commit, calling reset() on MockHttpServletResponse did not reset the `charset` field to `false` which could result in the "Content-Type" header containing `;charset=null` which in turn would result in errors when parsing the "Content-Type" header. This commit resets the charset field to `false` in MockHttpServletResponse's reset() method to avoid such errors. Closes gh-25501 --- .../mock/web/MockHttpServletResponse.java | 1 + .../web/MockHttpServletResponseTests.java | 23 +++++++++++++++++++ .../servlet/MockHttpServletResponse.java | 1 + 3 files changed, 25 insertions(+) diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java index 95f6092ebc54..f043c090030c 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java @@ -331,6 +331,7 @@ public boolean isCommitted() { public void reset() { resetBuffer(); this.characterEncoding = null; + this.charset = false; this.contentLength = 0; this.contentType = null; this.locale = Locale.getDefault(); diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java index 1dd6f117aca9..0cf57f378690 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java @@ -458,4 +458,27 @@ private void assertPrimarySessionCookie(String expectedValue) { assertThat(((MockCookie) cookie).getSameSite()).isEqualTo("Lax"); } + @Test // gh-25501 + void resetResetsCharset() { + assertThat(response.isCharset()).isFalse(); + response.setCharacterEncoding("UTF-8"); + assertThat(response.isCharset()).isTrue(); + assertThat(response.getCharacterEncoding()).isEqualTo("UTF-8"); + response.setContentType("text/plain"); + assertThat(response.getContentType()).isEqualTo("text/plain"); + String contentTypeHeader = response.getHeader(CONTENT_TYPE); + assertThat(contentTypeHeader).isEqualTo("text/plain;charset=UTF-8"); + + response.reset(); + + assertThat(response.isCharset()).isFalse(); + // Do not invoke setCharacterEncoding() since that sets the charset flag to true. + // response.setCharacterEncoding("UTF-8"); + response.setContentType("text/plain"); + assertThat(response.isCharset()).isFalse(); // should still be false + assertThat(response.getContentType()).isEqualTo("text/plain"); + contentTypeHeader = response.getHeader(CONTENT_TYPE); + assertThat(contentTypeHeader).isEqualTo("text/plain"); + } + } diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java index 94fbd0875fc8..e0cbd6202213 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java @@ -331,6 +331,7 @@ public boolean isCommitted() { public void reset() { resetBuffer(); this.characterEncoding = null; + this.charset = false; this.contentLength = 0; this.contentType = null; this.locale = Locale.getDefault();