Skip to content

Commit 54853ee

Browse files
committed
Support setCharacterEncoding(null) in MockHttpServletResponse
Closes gh-30341
1 parent b408cee commit 54853ee

File tree

3 files changed

+78
-10
lines changed

3 files changed

+78
-10
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Collection;
3434
import java.util.Collections;
3535
import java.util.Date;
36+
import java.util.LinkedHashMap;
3637
import java.util.List;
3738
import java.util.Locale;
3839
import java.util.Map;
@@ -201,15 +202,42 @@ public boolean isCharset() {
201202
}
202203

203204
@Override
204-
public void setCharacterEncoding(String characterEncoding) {
205+
public void setCharacterEncoding(@Nullable String characterEncoding) {
205206
setExplicitCharacterEncoding(characterEncoding);
206207
updateContentTypePropertyAndHeader();
207208
}
208209

209-
private void setExplicitCharacterEncoding(String characterEncoding) {
210-
Assert.notNull(characterEncoding, "'characterEncoding' must not be null");
211-
this.characterEncoding = characterEncoding;
212-
this.characterEncodingSet = true;
210+
private void setExplicitCharacterEncoding(@Nullable String characterEncoding) {
211+
if (characterEncoding == null) {
212+
this.characterEncoding = this.defaultCharacterEncoding;
213+
this.characterEncodingSet = false;
214+
if (this.contentType != null) {
215+
try {
216+
MediaType mediaType = MediaType.parseMediaType(this.contentType);
217+
if (mediaType.getCharset() != null) {
218+
Map<String, String> parameters = new LinkedHashMap<>(mediaType.getParameters());
219+
parameters.remove("charset");
220+
mediaType = new MediaType(mediaType.getType(), mediaType.getSubtype(), parameters);
221+
this.contentType = mediaType.toString();
222+
}
223+
}
224+
catch (Exception ignored) {
225+
String value = this.contentType;
226+
int charsetIndex = value.toLowerCase().indexOf(CHARSET_PREFIX);
227+
if (charsetIndex != -1) {
228+
value = value.substring(0, charsetIndex).trim();
229+
if (value.endsWith(";")) {
230+
value = value.substring(0, value.length() - 1);
231+
}
232+
this.contentType = value;
233+
}
234+
}
235+
}
236+
}
237+
else {
238+
this.characterEncoding = characterEncoding;
239+
this.characterEncodingSet = true;
240+
}
213241
}
214242

215243
private void updateContentTypePropertyAndHeader() {

spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,18 @@ void setCharacterEncodingThenContentType() {
195195
assertThat(response.getCharacterEncoding()).isEqualTo("UTF-8");
196196
}
197197

198+
@Test
199+
void setCharacterEncodingNull() {
200+
response.setContentType("test/plain");
201+
response.setCharacterEncoding("UTF-8");
202+
assertThat(response.getContentType()).isEqualTo("test/plain;charset=UTF-8");
203+
assertThat(response.getHeader(CONTENT_TYPE)).isEqualTo("test/plain;charset=UTF-8");
204+
response.setCharacterEncoding(null);
205+
assertThat(response.getContentType()).isEqualTo("test/plain");
206+
assertThat(response.getHeader(CONTENT_TYPE)).isEqualTo("test/plain");
207+
assertThat(response.getCharacterEncoding()).isEqualTo(WebUtils.DEFAULT_CHARACTER_ENCODING);
208+
}
209+
198210
@Test
199211
void defaultCharacterEncoding() {
200212
assertThat(response.isCharset()).isFalse();

spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Collection;
3434
import java.util.Collections;
3535
import java.util.Date;
36+
import java.util.LinkedHashMap;
3637
import java.util.List;
3738
import java.util.Locale;
3839
import java.util.Map;
@@ -201,15 +202,42 @@ public boolean isCharset() {
201202
}
202203

203204
@Override
204-
public void setCharacterEncoding(String characterEncoding) {
205+
public void setCharacterEncoding(@Nullable String characterEncoding) {
205206
setExplicitCharacterEncoding(characterEncoding);
206207
updateContentTypePropertyAndHeader();
207208
}
208209

209-
private void setExplicitCharacterEncoding(String characterEncoding) {
210-
Assert.notNull(characterEncoding, "'characterEncoding' must not be null");
211-
this.characterEncoding = characterEncoding;
212-
this.characterEncodingSet = true;
210+
private void setExplicitCharacterEncoding(@Nullable String characterEncoding) {
211+
if (characterEncoding == null) {
212+
this.characterEncoding = this.defaultCharacterEncoding;
213+
this.characterEncodingSet = false;
214+
if (this.contentType != null) {
215+
try {
216+
MediaType mediaType = MediaType.parseMediaType(this.contentType);
217+
if (mediaType.getCharset() != null) {
218+
Map<String, String> parameters = new LinkedHashMap<>(mediaType.getParameters());
219+
parameters.remove("charset");
220+
mediaType = new MediaType(mediaType.getType(), mediaType.getSubtype(), parameters);
221+
this.contentType = mediaType.toString();
222+
}
223+
}
224+
catch (Exception ignored) {
225+
String value = this.contentType;
226+
int charsetIndex = value.toLowerCase().indexOf(CHARSET_PREFIX);
227+
if (charsetIndex != -1) {
228+
value = value.substring(0, charsetIndex).trim();
229+
if (value.endsWith(";")) {
230+
value = value.substring(0, value.length() - 1);
231+
}
232+
this.contentType = value;
233+
}
234+
}
235+
}
236+
}
237+
else {
238+
this.characterEncoding = characterEncoding;
239+
this.characterEncodingSet = true;
240+
}
213241
}
214242

215243
private void updateContentTypePropertyAndHeader() {

0 commit comments

Comments
 (0)