23
23
import reactor .core .publisher .Mono ;
24
24
25
25
import org .springframework .http .HttpHeaders ;
26
+ import org .springframework .http .server .reactive .ServerHttpRequest ;
26
27
import org .springframework .lang .Nullable ;
28
+ import org .springframework .mock .http .server .reactive .test .MockServerHttpRequest ;
27
29
import org .springframework .mock .web .test .server .MockServerWebExchange ;
28
30
import org .springframework .web .server .ServerWebExchange ;
29
31
import org .springframework .web .server .WebFilterChain ;
30
32
31
33
import static org .junit .Assert .*;
32
- import static org .springframework .mock .http .server .reactive .test .MockServerHttpRequest .*;
33
34
34
35
/**
36
+ * Unit tests for {@link ForwardedHeaderFilter}.
35
37
* @author Arjen Poutsma
38
+ * @author Rossen Stoyanchev
36
39
*/
37
40
public class ForwardedHeaderFilterTests {
38
41
@@ -46,65 +49,65 @@ public class ForwardedHeaderFilterTests {
46
49
47
50
@ Test
48
51
public void removeOnly () {
49
- ServerWebExchange exchange = MockServerWebExchange .from (get (BASE_URL )
50
- .header ("Forwarded" , "for=192.0.2.60;proto=http;by=203.0.113.43" )
51
- .header ("X-Forwarded-Host" , "example.com" )
52
- .header ("X-Forwarded-Port" , "8080" )
53
- .header ("X-Forwarded-Proto" , "http" )
54
- .header ("X-Forwarded-Prefix" , "prefix" )
55
- .header ("X-Forwarded-Ssl" , "on" ));
56
52
57
53
this .filter .setRemoveOnly (true );
58
- this .filter .filter (exchange , this .filterChain ).block (Duration .ZERO );
59
-
60
- HttpHeaders result = this .filterChain .getHeaders ();
61
- assertNotNull (result );
62
- assertFalse (result .containsKey ("Forwarded" ));
63
- assertFalse (result .containsKey ("X-Forwarded-Host" ));
64
- assertFalse (result .containsKey ("X-Forwarded-Port" ));
65
- assertFalse (result .containsKey ("X-Forwarded-Proto" ));
66
- assertFalse (result .containsKey ("X-Forwarded-Prefix" ));
67
- assertFalse (result .containsKey ("X-Forwarded-Ssl" ));
54
+
55
+ HttpHeaders headers = new HttpHeaders ();
56
+ headers .add ("Forwarded" , "for=192.0.2.60;proto=http;by=203.0.113.43" );
57
+ headers .add ("X-Forwarded-Host" , "example.com" );
58
+ headers .add ("X-Forwarded-Port" , "8080" );
59
+ headers .add ("X-Forwarded-Proto" , "http" );
60
+ headers .add ("X-Forwarded-Prefix" , "prefix" );
61
+ headers .add ("X-Forwarded-Ssl" , "on" );
62
+ this .filter .filter (getExchange (headers ), this .filterChain ).block (Duration .ZERO );
63
+
64
+ this .filterChain .assertForwardedHeadersRemoved ();
68
65
}
69
66
70
67
@ Test
71
- public void xForwardedRequest () throws Exception {
72
- ServerWebExchange exchange = MockServerWebExchange .from (get (BASE_URL )
73
- .header ("X-Forwarded-Host" , "84.198.58.199" )
74
- .header ("X-Forwarded-Port" , "443" )
75
- .header ("X-Forwarded-Proto" , "https" ));
76
-
77
- assertEquals (new URI ("https://84.198.58.199/path" ), filterAndGetUri (exchange ));
68
+ public void xForwardedHeaders () throws Exception {
69
+ HttpHeaders headers = new HttpHeaders ();
70
+ headers .add ("X-Forwarded-Host" , "84.198.58.199" );
71
+ headers .add ("X-Forwarded-Port" , "443" );
72
+ headers .add ("X-Forwarded-Proto" , "https" );
73
+ headers .add ("foo" , "bar" );
74
+ this .filter .filter (getExchange (headers ), this .filterChain ).block (Duration .ZERO );
75
+
76
+ assertEquals (new URI ("https://84.198.58.199/path" ), this .filterChain .uri );
78
77
}
79
78
80
79
@ Test
81
- public void forwardedRequest () throws Exception {
82
- ServerWebExchange exchange = MockServerWebExchange .from (get (BASE_URL )
83
- .header ("Forwarded" , "host=84.198.58.199;proto=https" ));
80
+ public void forwardedHeader () throws Exception {
81
+ HttpHeaders headers = new HttpHeaders ();
82
+ headers .add ("Forwarded" , "host=84.198.58.199;proto=https" );
83
+ this .filter .filter (getExchange (headers ), this .filterChain ).block (Duration .ZERO );
84
84
85
- assertEquals (new URI ("https://84.198.58.199/path" ), filterAndGetUri ( exchange ) );
85
+ assertEquals (new URI ("https://84.198.58.199/path" ), this . filterChain . uri );
86
86
}
87
87
88
88
@ Test
89
- public void requestUriWithForwardedPrefix () throws Exception {
90
- ServerWebExchange exchange = MockServerWebExchange .from (get (BASE_URL )
91
- .header ("X-Forwarded-Prefix" , "/prefix" ));
89
+ public void xForwardedPrefix () throws Exception {
90
+ HttpHeaders headers = new HttpHeaders ();
91
+ headers .add ("X-Forwarded-Prefix" , "/prefix" );
92
+ this .filter .filter (getExchange (headers ), this .filterChain ).block (Duration .ZERO );
92
93
93
- assertEquals (new URI ("http://example.com/prefix/path" ), filterAndGetUri (exchange ));
94
+ assertEquals (new URI ("http://example.com/prefix/path" ), this .filterChain .uri );
95
+ assertEquals ("/prefix/path" , this .filterChain .requestPathValue );
94
96
}
95
97
96
98
@ Test
97
- public void requestUriWithForwardedPrefixTrailingSlash () throws Exception {
98
- ServerWebExchange exchange = MockServerWebExchange .from (get (BASE_URL )
99
- .header ("X-Forwarded-Prefix" , "/prefix/" ));
99
+ public void xForwardedPrefixTrailingSlash () throws Exception {
100
+ HttpHeaders headers = new HttpHeaders ();
101
+ headers .add ("X-Forwarded-Prefix" , "/prefix////" );
102
+ this .filter .filter (getExchange (headers ), this .filterChain ).block (Duration .ZERO );
100
103
101
- assertEquals (new URI ("http://example.com/prefix/path" ), filterAndGetUri (exchange ));
104
+ assertEquals (new URI ("http://example.com/prefix/path" ), this .filterChain .uri );
105
+ assertEquals ("/prefix/path" , this .filterChain .requestPathValue );
102
106
}
103
107
104
- @ Nullable
105
- private URI filterAndGetUri (ServerWebExchange exchange ) {
106
- this .filter .filter (exchange , this .filterChain ).block (Duration .ZERO );
107
- return this .filterChain .uri ;
108
+ private MockServerWebExchange getExchange (HttpHeaders headers ) {
109
+ MockServerHttpRequest request = MockServerHttpRequest .get (BASE_URL ).headers (headers ).build ();
110
+ return MockServerWebExchange .from (request );
108
111
}
109
112
110
113
@@ -116,21 +119,37 @@ private static class TestWebFilterChain implements WebFilterChain {
116
119
@ Nullable
117
120
private URI uri ;
118
121
122
+ @ Nullable String requestPathValue ;
123
+
119
124
120
125
@ Nullable
121
126
public HttpHeaders getHeaders () {
122
127
return this .headers ;
123
128
}
124
129
130
+ @ Nullable
131
+ public String getHeader (String name ) {
132
+ assertNotNull (this .headers );
133
+ return this .headers .getFirst (name );
134
+ }
135
+
136
+ public void assertForwardedHeadersRemoved () {
137
+ assertNotNull (this .headers );
138
+ ForwardedHeaderFilter .FORWARDED_HEADER_NAMES
139
+ .forEach (name -> assertFalse (this .headers .containsKey (name )));
140
+ }
141
+
125
142
@ Nullable
126
143
public URI getUri () {
127
144
return this .uri ;
128
145
}
129
146
130
147
@ Override
131
148
public Mono <Void > filter (ServerWebExchange exchange ) {
132
- this .headers = exchange .getRequest ().getHeaders ();
133
- this .uri = exchange .getRequest ().getURI ();
149
+ ServerHttpRequest request = exchange .getRequest ();
150
+ this .headers = request .getHeaders ();
151
+ this .uri = request .getURI ();
152
+ this .requestPathValue = request .getPath ().value ();
134
153
return Mono .empty ();
135
154
}
136
155
}
0 commit comments