16
16
package org .springframework .web .filter ;
17
17
18
18
import java .io .IOException ;
19
+ import java .util .Enumeration ;
19
20
import javax .servlet .ServletException ;
20
21
import javax .servlet .http .HttpServlet ;
21
22
import javax .servlet .http .HttpServletRequest ;
39
40
*/
40
41
public class ForwardedHeaderFilterTests {
41
42
43
+ private static final String X_FORWARDED_PROTO = "x-forwarded-proto" ; // SPR-14372 (case insensitive)
44
+ private static final String X_FORWARDED_HOST = "x-forwarded-host" ;
45
+ private static final String X_FORWARDED_PORT = "x-forwarded-port" ;
46
+ private static final String X_FORWARDED_PREFIX = "x-forwarded-prefix" ;
47
+
48
+
42
49
private final ForwardedHeaderFilter filter = new ForwardedHeaderFilter ();
43
50
44
51
private MockHttpServletRequest request ;
@@ -59,25 +66,25 @@ public void setUp() throws Exception {
59
66
60
67
@ Test
61
68
public void contextPathEmpty () throws Exception {
62
- this .request .addHeader ("X-Forwarded-Prefix" , "" );
69
+ this .request .addHeader (X_FORWARDED_PREFIX , "" );
63
70
assertEquals ("" , filterAndGetContextPath ());
64
71
}
65
72
66
73
@ Test
67
74
public void contextPathWithTrailingSlash () throws Exception {
68
- this .request .addHeader ("X-Forwarded-Prefix" , "/foo/bar/" );
75
+ this .request .addHeader (X_FORWARDED_PREFIX , "/foo/bar/" );
69
76
assertEquals ("/foo/bar" , filterAndGetContextPath ());
70
77
}
71
78
72
79
@ Test
73
80
public void contextPathWithTrailingSlashes () throws Exception {
74
- this .request .addHeader ("X-Forwarded-Prefix" , "/foo/bar/baz///" );
81
+ this .request .addHeader (X_FORWARDED_PREFIX , "/foo/bar/baz///" );
75
82
assertEquals ("/foo/bar/baz" , filterAndGetContextPath ());
76
83
}
77
84
78
85
@ Test
79
86
public void requestUri () throws Exception {
80
- this .request .addHeader ("X-Forwarded-Prefix" , "/" );
87
+ this .request .addHeader (X_FORWARDED_PREFIX , "/" );
81
88
this .request .setContextPath ("/app" );
82
89
this .request .setRequestURI ("/app/path" );
83
90
HttpServletRequest actual = filterAndGetWrappedRequest ();
@@ -88,7 +95,7 @@ public void requestUri() throws Exception {
88
95
89
96
@ Test
90
97
public void requestUriWithTrailingSlash () throws Exception {
91
- this .request .addHeader ("X-Forwarded-Prefix" , "/" );
98
+ this .request .addHeader (X_FORWARDED_PREFIX , "/" );
92
99
this .request .setContextPath ("/app" );
93
100
this .request .setRequestURI ("/app/path/" );
94
101
HttpServletRequest actual = filterAndGetWrappedRequest ();
@@ -98,7 +105,7 @@ public void requestUriWithTrailingSlash() throws Exception {
98
105
}
99
106
@ Test
100
107
public void requestUriEqualsContextPath () throws Exception {
101
- this .request .addHeader ("X-Forwarded-Prefix" , "/" );
108
+ this .request .addHeader (X_FORWARDED_PREFIX , "/" );
102
109
this .request .setContextPath ("/app" );
103
110
this .request .setRequestURI ("/app" );
104
111
HttpServletRequest actual = filterAndGetWrappedRequest ();
@@ -109,7 +116,7 @@ public void requestUriEqualsContextPath() throws Exception {
109
116
110
117
@ Test
111
118
public void requestUriRootUrl () throws Exception {
112
- this .request .addHeader ("X-Forwarded-Prefix" , "/" );
119
+ this .request .addHeader (X_FORWARDED_PREFIX , "/" );
113
120
this .request .setContextPath ("/app" );
114
121
this .request .setRequestURI ("/app/" );
115
122
HttpServletRequest actual = filterAndGetWrappedRequest ();
@@ -118,12 +125,37 @@ public void requestUriRootUrl() throws Exception {
118
125
assertEquals ("/" , actual .getRequestURI ());
119
126
}
120
127
128
+ @ Test
129
+ public void caseInsensitiveForwardedPrefix () throws Exception {
130
+ this .request = new MockHttpServletRequest () {
131
+
132
+ // Make it case-sensitive (SPR-14372)
133
+
134
+ @ Override
135
+ public String getHeader (String header ) {
136
+ Enumeration <String > names = getHeaderNames ();
137
+ while (names .hasMoreElements ()) {
138
+ String name = names .nextElement ();
139
+ if (name .equals (header )) {
140
+ return super .getHeader (header );
141
+ }
142
+ }
143
+ return null ;
144
+ }
145
+ };
146
+ this .request .addHeader (X_FORWARDED_PREFIX , "/prefix" );
147
+ this .request .setRequestURI ("/path" );
148
+ HttpServletRequest actual = filterAndGetWrappedRequest ();
149
+
150
+ assertEquals ("/prefix/path" , actual .getRequestURI ());
151
+ }
152
+
121
153
@ Test
122
154
public void shouldFilter () throws Exception {
123
155
testShouldFilter ("Forwarded" );
124
- testShouldFilter ("X-Forwarded-Host" );
125
- testShouldFilter ("X-Forwarded-Port" );
126
- testShouldFilter ("X-Forwarded-Proto" );
156
+ testShouldFilter (X_FORWARDED_HOST );
157
+ testShouldFilter (X_FORWARDED_PORT );
158
+ testShouldFilter (X_FORWARDED_PROTO );
127
159
}
128
160
129
161
@ Test
@@ -134,9 +166,9 @@ public void shouldNotFilter() throws Exception {
134
166
@ Test
135
167
public void forwardedRequest () throws Exception {
136
168
this .request .setRequestURI ("/mvc-showcase" );
137
- this .request .addHeader ("X-Forwarded-Proto" , "https" );
138
- this .request .addHeader ("X-Forwarded-Host" , "84.198.58.199" );
139
- this .request .addHeader ("X-Forwarded-Port" , "443" );
169
+ this .request .addHeader (X_FORWARDED_PROTO , "https" );
170
+ this .request .addHeader (X_FORWARDED_HOST , "84.198.58.199" );
171
+ this .request .addHeader (X_FORWARDED_PORT , "443" );
140
172
this .request .addHeader ("foo" , "bar" );
141
173
142
174
this .filter .doFilter (this .request , new MockHttpServletResponse (), this .filterChain );
@@ -148,15 +180,15 @@ public void forwardedRequest() throws Exception {
148
180
assertEquals (443 , actual .getServerPort ());
149
181
assertTrue (actual .isSecure ());
150
182
151
- assertNull (actual .getHeader ("X-Forwarded-Proto" ));
152
- assertNull (actual .getHeader ("X-Forwarded-Host" ));
153
- assertNull (actual .getHeader ("X-Forwarded-Port" ));
183
+ assertNull (actual .getHeader (X_FORWARDED_PROTO ));
184
+ assertNull (actual .getHeader (X_FORWARDED_HOST ));
185
+ assertNull (actual .getHeader (X_FORWARDED_PORT ));
154
186
assertEquals ("bar" , actual .getHeader ("foo" ));
155
187
}
156
188
157
189
@ Test
158
190
public void requestUriWithForwardedPrefix () throws Exception {
159
- this .request .addHeader ("X-Forwarded-Prefix" , "/prefix" );
191
+ this .request .addHeader (X_FORWARDED_PREFIX , "/prefix" );
160
192
this .request .setRequestURI ("/mvc-showcase" );
161
193
162
194
HttpServletRequest actual = filterAndGetWrappedRequest ();
@@ -165,7 +197,7 @@ public void requestUriWithForwardedPrefix() throws Exception {
165
197
166
198
@ Test
167
199
public void requestUriWithForwardedPrefixTrailingSlash () throws Exception {
168
- this .request .addHeader ("X-Forwarded-Prefix" , "/prefix/" );
200
+ this .request .addHeader (X_FORWARDED_PREFIX , "/prefix/" );
169
201
this .request .setRequestURI ("/mvc-showcase" );
170
202
171
203
HttpServletRequest actual = filterAndGetWrappedRequest ();
@@ -174,7 +206,7 @@ public void requestUriWithForwardedPrefixTrailingSlash() throws Exception {
174
206
175
207
@ Test
176
208
public void contextPathWithForwardedPrefix () throws Exception {
177
- this .request .addHeader ("X-Forwarded-Prefix" , "/prefix" );
209
+ this .request .addHeader (X_FORWARDED_PREFIX , "/prefix" );
178
210
this .request .setContextPath ("/mvc-showcase" );
179
211
180
212
String actual = filterAndGetContextPath ();
@@ -183,7 +215,7 @@ public void contextPathWithForwardedPrefix() throws Exception {
183
215
184
216
@ Test
185
217
public void contextPathWithForwardedPrefixTrailingSlash () throws Exception {
186
- this .request .addHeader ("X-Forwarded-Prefix" , "/prefix/" );
218
+ this .request .addHeader (X_FORWARDED_PREFIX , "/prefix/" );
187
219
this .request .setContextPath ("/mvc-showcase" );
188
220
189
221
String actual = filterAndGetContextPath ();
0 commit comments