Skip to content

Commit d80de04

Browse files
committed
Fix filtered HTTP headers in data binding
Prior to this commit, several common HTTP headers were ignored from the data binding process when collecting property values, in gh-34039 and gh-34182. This commit completes the initial enhancement by ensuring that the default header predicate is also considering cases where constructor binding is applied and the Java type has a lowercase variant of the HTTP header name to filter. Fixes gh-34292
1 parent 7c5b6f1 commit d80de04

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExtendedWebExchangeDataBinder.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.web.reactive.result.method.annotation;
1818

1919
import java.util.List;
20+
import java.util.Locale;
2021
import java.util.Map;
2122
import java.util.Set;
2223
import java.util.function.Predicate;
@@ -43,11 +44,11 @@
4344
*/
4445
public class ExtendedWebExchangeDataBinder extends WebExchangeDataBinder {
4546

46-
private static final Set<String> FILTERED_HEADER_NAMES = Set.of("Accept", "Authorization", "Connection",
47-
"Cookie", "From", "Host", "Origin", "Priority", "Range", "Referer", "Upgrade");
47+
private static final Set<String> FILTERED_HEADER_NAMES = Set.of("accept", "authorization", "connection",
48+
"cookie", "from", "host", "origin", "priority", "range", "referer", "upgrade");
4849

4950

50-
private Predicate<String> headerPredicate = name -> !FILTERED_HEADER_NAMES.contains(name);
51+
private Predicate<String> headerPredicate = name -> !FILTERED_HEADER_NAMES.contains(name.toLowerCase(Locale.ROOT));
5152

5253

5354
public ExtendedWebExchangeDataBinder(@Nullable Object target, String objectName) {

spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/InitBinderBindingContextTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ void headerPredicate() throws Exception {
224224

225225
@ParameterizedTest
226226
@ValueSource(strings = {"Accept", "Authorization", "Connection",
227-
"Cookie", "From", "Host", "Origin", "Priority", "Range", "Referer", "Upgrade"})
227+
"Cookie", "From", "Host", "Origin", "Priority", "Range", "Referer", "Upgrade", "priority"})
228228
void filteredHeaders(String headerName) throws Exception {
229229
MockServerHttpRequest request = MockServerHttpRequest.get("/path")
230230
.header(headerName, "u1")

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.ArrayList;
2020
import java.util.Enumeration;
2121
import java.util.List;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import java.util.Set;
2425
import java.util.function.Predicate;
@@ -39,7 +40,7 @@
3940
*
4041
* <p><strong>WARNING</strong>: Data binding can lead to security issues by exposing
4142
* parts of the object graph that are not meant to be accessed or modified by
42-
* external clients. Therefore the design and use of data binding should be considered
43+
* external clients. Therefore, the design and use of data binding should be considered
4344
* carefully with regard to security. For more details, please refer to the dedicated
4445
* sections on data binding for
4546
* <a href="https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-initbinder-model-design">Spring Web MVC</a> and
@@ -53,11 +54,11 @@
5354
*/
5455
public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder {
5556

56-
private static final Set<String> FILTERED_HEADER_NAMES = Set.of("Accept", "Authorization", "Connection",
57-
"Cookie", "From", "Host", "Origin", "Priority", "Range", "Referer", "Upgrade");
57+
private static final Set<String> FILTERED_HEADER_NAMES = Set.of("accept", "authorization", "connection",
58+
"cookie", "from", "host", "origin", "priority", "range", "referer", "upgrade");
5859

5960

60-
private Predicate<String> headerPredicate = name -> !FILTERED_HEADER_NAMES.contains(name);
61+
private Predicate<String> headerPredicate = name -> !FILTERED_HEADER_NAMES.contains(name.toLowerCase(Locale.ROOT));
6162

6263

6364
/**

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java

+25-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.beans.MutablePropertyValues;
2828
import org.springframework.beans.testfixture.beans.TestBean;
2929
import org.springframework.core.ResolvableType;
30+
import org.springframework.validation.BindingResult;
3031
import org.springframework.web.bind.ServletRequestDataBinder;
3132
import org.springframework.web.bind.annotation.BindParam;
3233
import org.springframework.web.bind.support.BindParamNameResolver;
@@ -36,7 +37,7 @@
3637
import static org.assertj.core.api.Assertions.assertThat;
3738

3839
/**
39-
* Test fixture for {@link ExtendedServletRequestDataBinder}.
40+
* Tests for {@link ExtendedServletRequestDataBinder}.
4041
*
4142
* @author Rossen Stoyanchev
4243
*/
@@ -136,6 +137,19 @@ void headerPredicateWithConstructorArgs() {
136137
assertThat(bean.someIntArray()).isNull();
137138
}
138139

140+
@Test
141+
void filteredPriorityHeaderForConstructorBinding() {
142+
TestBinder binder = new TestBinder();
143+
binder.setTargetType(ResolvableType.forClass(TestTarget.class));
144+
request.addHeader("Priority", "u1");
145+
146+
binder.construct(request);
147+
BindingResult result = binder.getBindingResult();
148+
TestTarget target = (TestTarget) result.getTarget();
149+
150+
assertThat(target.priority).isNull();
151+
}
152+
139153
@Test
140154
void headerPredicate() {
141155
TestBinder binder = new TestBinder();
@@ -179,4 +193,14 @@ public void addBindValues(MutablePropertyValues mpvs, ServletRequest request) {
179193
}
180194
}
181195

196+
static class TestTarget {
197+
198+
final String priority;
199+
200+
public TestTarget(String priority) {
201+
this.priority = priority;
202+
}
203+
204+
}
205+
182206
}

0 commit comments

Comments
 (0)