Skip to content

Commit 7f45485

Browse files
committed
Provide explicit force request/response properties
Update HttpEncodingProperties to offer explicit `force-request` and `force-reponse` properties in additional to the existing `force` property. Closes gh-5459
1 parent 6898340 commit 7f45485

File tree

4 files changed

+93
-13
lines changed

4 files changed

+93
-13
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpEncodingAutoConfiguration.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2121
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
23+
import org.springframework.boot.autoconfigure.web.HttpEncodingProperties.Type;
2324
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2425
import org.springframework.boot.web.filter.OrderedCharacterEncodingFilter;
2526
import org.springframework.context.annotation.Bean;
@@ -39,18 +40,19 @@
3940
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
4041
public class HttpEncodingAutoConfiguration {
4142

42-
private final HttpEncodingProperties httpEncodingProperties;
43+
private final HttpEncodingProperties properties;
4344

44-
public HttpEncodingAutoConfiguration(HttpEncodingProperties httpEncodingProperties) {
45-
this.httpEncodingProperties = httpEncodingProperties;
45+
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
46+
this.properties = properties;
4647
}
4748

4849
@Bean
4950
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
5051
public CharacterEncodingFilter characterEncodingFilter() {
5152
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
52-
filter.setEncoding(this.httpEncodingProperties.getCharset().name());
53-
filter.setForceRequestEncoding(this.httpEncodingProperties.isForce());
53+
filter.setEncoding(this.properties.getCharset().name());
54+
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
55+
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
5456
return filter;
5557
}
5658

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpEncodingProperties.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,17 @@ public class HttpEncodingProperties {
4040
/**
4141
* Force the encoding to the configured charset on HTTP requests and responses.
4242
*/
43-
private boolean force = true;
43+
private Boolean force;
44+
45+
/**
46+
* Force the encoding to the configured charset on HTTP requests.
47+
*/
48+
private Boolean forceRequest;
49+
50+
/**
51+
* Force the encoding to the configured charset on HTTP responses.
52+
*/
53+
private Boolean forceResponse;
4454

4555
public Charset getCharset() {
4656
return this.charset;
@@ -51,11 +61,42 @@ public void setCharset(Charset charset) {
5161
}
5262

5363
public boolean isForce() {
54-
return this.force;
64+
return Boolean.TRUE.equals(this.force);
5565
}
5666

5767
public void setForce(boolean force) {
5868
this.force = force;
5969
}
6070

71+
public boolean isForceRequest() {
72+
return Boolean.TRUE.equals(this.forceRequest);
73+
}
74+
75+
public void setForceRequest(boolean forceRequest) {
76+
this.forceRequest = forceRequest;
77+
}
78+
79+
public boolean isForceResponse() {
80+
return Boolean.TRUE.equals(this.forceResponse);
81+
}
82+
83+
public void setForceResponse(boolean forceResponse) {
84+
this.forceResponse = forceResponse;
85+
}
86+
87+
boolean shouldForce(Type type) {
88+
Boolean force = (type == Type.REQUEST ? this.forceRequest : this.forceResponse);
89+
if (force == null) {
90+
force = this.force;
91+
}
92+
if (force == null) {
93+
force = (type == Type.REQUEST ? true : false);
94+
}
95+
return force;
96+
}
97+
98+
enum Type {
99+
REQUEST, RESPONSE
100+
}
101+
61102
}

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpEncodingAutoConfigurationTests.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public void defaultConfiguration() {
6363
load(EmptyConfiguration.class);
6464
CharacterEncodingFilter filter = this.context
6565
.getBean(CharacterEncodingFilter.class);
66-
assertCharacterEncodingFilter(filter, "UTF-8", true);
66+
assertCharacterEncodingFilter(filter, "UTF-8", true, false);
6767
}
6868

6969
@Test
@@ -79,7 +79,7 @@ public void customConfiguration() {
7979
"spring.http.encoding.force:false");
8080
CharacterEncodingFilter filter = this.context
8181
.getBean(CharacterEncodingFilter.class);
82-
assertCharacterEncodingFilter(filter, "ISO-8859-15", false);
82+
assertCharacterEncodingFilter(filter, "ISO-8859-15", false, false);
8383
}
8484

8585
@Test
@@ -88,7 +88,41 @@ public void customFilterConfiguration() {
8888
"spring.http.encoding.force:false");
8989
CharacterEncodingFilter filter = this.context
9090
.getBean(CharacterEncodingFilter.class);
91-
assertCharacterEncodingFilter(filter, "US-ASCII", false);
91+
assertCharacterEncodingFilter(filter, "US-ASCII", false, false);
92+
}
93+
94+
@Test
95+
public void forceRequest() throws Exception {
96+
load(EmptyConfiguration.class, "spring.http.encoding.force-request:false");
97+
CharacterEncodingFilter filter = this.context
98+
.getBean(CharacterEncodingFilter.class);
99+
assertCharacterEncodingFilter(filter, "UTF-8", false, false);
100+
}
101+
102+
@Test
103+
public void forceResponse() throws Exception {
104+
load(EmptyConfiguration.class, "spring.http.encoding.force-response:true");
105+
CharacterEncodingFilter filter = this.context
106+
.getBean(CharacterEncodingFilter.class);
107+
assertCharacterEncodingFilter(filter, "UTF-8", true, true);
108+
}
109+
110+
@Test
111+
public void forceRequestOverridesForce() throws Exception {
112+
load(EmptyConfiguration.class, "spring.http.encoding.force:true",
113+
"spring.http.encoding.force-request:false");
114+
CharacterEncodingFilter filter = this.context
115+
.getBean(CharacterEncodingFilter.class);
116+
assertCharacterEncodingFilter(filter, "UTF-8", false, true);
117+
}
118+
119+
@Test
120+
public void forceResponseOverridesForce() throws Exception {
121+
load(EmptyConfiguration.class, "spring.http.encoding.force:true",
122+
"spring.http.encoding.force-response:false");
123+
CharacterEncodingFilter filter = this.context
124+
.getBean(CharacterEncodingFilter.class);
125+
assertCharacterEncodingFilter(filter, "UTF-8", true, false);
92126
}
93127

94128
@Test
@@ -102,10 +136,11 @@ public void filterIsOrderedHighest() throws Exception {
102136
}
103137

104138
private void assertCharacterEncodingFilter(CharacterEncodingFilter actual,
105-
String encoding, boolean forceRequestEncoding) {
139+
String encoding, boolean forceRequestEncoding,
140+
boolean forceResponseEncoding) {
106141
assertThat(actual.getEncoding()).isEqualTo(encoding);
107142
assertThat(actual.isForceRequestEncoding()).isEqualTo(forceRequestEncoding);
108-
assertThat(actual.isForceResponseEncoding()).isFalse();
143+
assertThat(actual.isForceResponseEncoding()).isEqualTo(forceResponseEncoding);
109144
}
110145

111146
private void load(Class<?> config, String... environment) {

spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,9 @@ content into your application; rather pick only the properties that you need.
268268
# HTTP encoding ({sc-spring-boot-autoconfigure}/web/HttpEncodingProperties.{sc-ext}[HttpEncodingProperties])
269269
spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.
270270
spring.http.encoding.enabled=true # Enable http encoding support.
271-
spring.http.encoding.force=true # Force the encoding to the configured charset on HTTP requests and responses.
271+
spring.http.encoding.force= # Force the encoding to the configured charset on HTTP requests and responses.
272+
spring.http.encoding.force-request= # Force the encoding to the configured charset on HTTP requests (defaults to true when ".force" has not been specified).
273+
spring.http.encoding.force-response= # Force the encoding to the configured charset on HTTP responses.
272274
273275
# MULTIPART ({sc-spring-boot-autoconfigure}/web/MultipartProperties.{sc-ext}[MultipartProperties])
274276
spring.http.multipart.enabled=true # Enable support of multi-part uploads.

0 commit comments

Comments
 (0)