Skip to content

Commit 7bc8f72

Browse files
Merge branch 'spring-cloud:main' into #2975-Suggestion-Add-Permissions-Policy-as-configurable-option-to-SecureHeaders-GatewayFilter
2 parents 85ab7d9 + e116c07 commit 7bc8f72

File tree

79 files changed

+1574
-432
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1574
-432
lines changed

docs/modules/ROOT/pages/spring-cloud-gateway-server-webflux/gatewayfilter-factories/retry-factory.adoc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ The `Retry` `GatewayFilter` factory supports the following parameters:
1212
Retries are performed after a backoff interval of `firstBackoff * (factor ^ n)`, where `n` is the iteration.
1313
If `maxBackoff` is configured, the maximum backoff applied is limited to `maxBackoff`.
1414
If `basedOnPreviousValue` is true, the backoff is calculated by using `prevBackoff * factor`.
15+
* `jitter`: The configured random jitter for the retries.
16+
Generating a backoff between `[backoff - backoff*randomFactor, backoff + backoff*randomFactor]`
17+
* `timeout`: The configured timeout for the retries.
1518

1619
The following defaults are configured for `Retry` filter, if enabled:
1720

@@ -20,6 +23,8 @@ The following defaults are configured for `Retry` filter, if enabled:
2023
* `methods`: GET method
2124
* `exceptions`: `IOException` and `TimeoutException`
2225
* `backoff`: disabled
26+
* `jitter`: disabled
27+
* `timeout`: unlimited
2328

2429
The following listing configures a Retry `GatewayFilter`:
2530

@@ -45,6 +50,9 @@ spring:
4550
maxBackoff: 50ms
4651
factor: 2
4752
basedOnPreviousValue: false
53+
jitter:
54+
randomFactor: 0.5
55+
timeout: 100ms
4856
----
4957

5058
NOTE: When using the retry filter with a `forward:` prefixed URL, the target endpoint should be written carefully so that, in case of an error, it does not do anything that could result in a response being sent to the client and committed.
@@ -79,10 +87,13 @@ spring:
7987
maxBackoff: 50ms
8088
factor: 2
8189
basedOnPreviousValue: false
90+
jitter:
91+
randomFactor: 0.5
92+
timeout: 100ms
8293
8394
- id: retryshortcut_route
8495
uri: https://example.org
8596
filters:
86-
- Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false
97+
- Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false,0.5,100ms
8798
----
8899

docs/modules/ROOT/pages/spring-cloud-gateway-server-webflux/httpheadersfilters.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
== Forwarded Headers Filter
88
The `Forwarded` Headers Filter creates a `Forwarded` header to send to the downstream service. It adds the `Host` header, scheme and port of the current request to any existing `Forwarded` header.
99

10+
The `Forwarded by` header part can be enabled by setting the following property to true (defaults to false):
11+
12+
- `spring.cloud.gateway.forwarded.by.enabled=true`
13+
1014
[[removehopbyhop-headers-filter]]
1115
== RemoveHopByHop Headers Filter
1216
The `RemoveHopByHop` Headers Filter removes headers from forwarded requests. The default list of headers that is removed comes from the https://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-14#section-7.1.3[IETF].

docs/modules/ROOT/pages/spring-cloud-gateway-server-webmvc/filters/addrequestheader.adoc

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ spring:
1414
routes:
1515
- id: add_request_header_route
1616
uri: https://example.org
17+
predicates:
18+
- Path=/red
1719
filters:
1820
- AddRequestHeader=X-Request-red, blue
1921
----
2022

2123
.GatewaySampleApplication.java
2224
[source,java]
2325
----
26+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
2427
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.addRequestHeader;
2528
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
2629
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -30,10 +33,10 @@ class RouteConfiguration {
3033
3134
@Bean
3235
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
33-
return route("addRequestHeader")
34-
.route(GET("/red"), http("https://example.org"))
35-
.before(addRequestHeader("X-Request-red", "blue"))
36-
.build();
36+
return route("add_request_header_route")
37+
.GET("/red", http())
38+
.before(uri("https://example.org"))
39+
.before(addRequestHeader("X-Request-red", "blue"));
3740
}
3841
}
3942
----
@@ -47,15 +50,20 @@ The following example configures an `AddRequestHeader` filter that uses a variab
4750
.GatewaySampleApplication.java
4851
[source,java]
4952
----
53+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
54+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.addRequestHeader;
55+
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
56+
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
57+
5058
@Configuration
5159
class RouteConfiguration {
5260
5361
@Bean
5462
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
55-
return route("addRequestHeader")
56-
.route(GET("/red/{segment}"), http("https://example.org"))
57-
.before(addRequestHeader("X-Request-red", "blue-{segment}"))
58-
.build();
63+
return route("add_request_header_route")
64+
.GET("/red/{segment}", http())
65+
.before(uri("https://example.org"))
66+
.before(addRequestHeader("X-Request-red", "blue-{segment}"));
5967
}
6068
}
6169
----

docs/modules/ROOT/pages/spring-cloud-gateway-server-webmvc/filters/addrequestheadersifnotpresent.adoc

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,18 @@ spring:
1212
gateway:
1313
mvc:
1414
routes:
15-
- id: add_request_headers_route
15+
- id: add_request_headers_route_inp
1616
uri: https://example.org
17+
predicates:
18+
- Path=/red
1719
filters:
1820
- AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green
1921
----
2022

2123
.GatewaySampleApplication.java
2224
[source,java]
2325
----
26+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
2427
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.addRequestHeadersIfNotPresent;
2528
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
2629
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -29,9 +32,11 @@ import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFuncti
2932
class RouteConfiguration {
3033
3134
@Bean
32-
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
33-
return route(GET("/red"), http("https://example.org"))
34-
.before(addRequestHeadersIfNotPresent("X-Request-Color-1:blue","X-Request-Color-2:green"));
35+
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeaderInp() {
36+
return route("add_request_headers_route_inp")
37+
.GET("/red", http())
38+
.before(uri("https://example.org"))
39+
.before(addRequestHeadersIfNotPresent("X-Request-Color-1:blue","X-Request-Color-2:green"));
3540
}
3641
}
3742
----
@@ -49,13 +54,20 @@ The following example configures an `AddRequestHeadersIfNotPresent` filter that
4954
.GatewaySampleApplication.java
5055
[source,java]
5156
----
57+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.addRequestHeadersIfNotPresent;
58+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
59+
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
60+
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
61+
5262
@Configuration
5363
class RouteConfiguration {
5464
5565
@Bean
56-
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
57-
return route(GET("/red/{segment}"), http("https://example.org"))
58-
.before(addRequestHeadersIfNotPresent("X-Request-red", "blue-{segment}"));
66+
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeaderInp() {
67+
return route("add_request_header_route_inp")
68+
.GET("/red/{segment}", http())
69+
.before(uri("https://example.org"))
70+
.before(addRequestHeadersIfNotPresent("X-Request-red", "blue-{segment}"));
5971
}
6072
}
6173
----
@@ -66,7 +78,7 @@ spring:
6678
cloud:
6779
gateway:
6880
routes:
69-
- id: add_request_header_route
81+
- id: add_request_header_route_inp
7082
uri: https://example.org
7183
predicates:
7284
- Path=/red/{segment}

docs/modules/ROOT/pages/spring-cloud-gateway-server-webmvc/filters/addrequestparameter.adoc

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ spring:
1414
routes:
1515
- id: add_request_parameter_route
1616
uri: https://example.org
17+
predicates:
18+
- Path=/anything/addrequestparam
1719
filters:
1820
- AddRequestParameter=red, blue
1921
----
2022

2123
.GatewaySampleApplication.java
2224
[source,java]
2325
----
26+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
2427
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.addRequestParameter;
2528
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
2629
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -29,11 +32,12 @@ import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFuncti
2932
class RouteConfiguration {
3033
3134
@Bean
32-
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
33-
return route("add_request_parameter_route")
34-
.GET("/anything/addrequestparam", http("https://example.org"))
35-
.before(addRequestParameter("red", "blue"))
36-
.build();
35+
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqParameter() {
36+
return route("add_request_parameter_route")
37+
.GET("/anything/addrequestparam", http())
38+
.before(uri("https://example.org"))
39+
.before(addRequestParameter("red", "blue"))
40+
.build();
3741
}
3842
}
3943
----
@@ -47,6 +51,7 @@ The following example configures an `AddRequestParameter` filter that uses a var
4751
.GatewaySampleApplication.java
4852
[source,java]
4953
----
54+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
5055
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.addRequestParameter;
5156
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
5257
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -56,11 +61,12 @@ import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequ
5661
class RouteConfiguration {
5762
5863
@Bean
59-
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
60-
return route("add_request_parameter_route")
61-
.route(host("{segment}.myhost.org"), http("https://example.org"))
62-
.before(addRequestParameter("foo", "bar-{segment}"))
63-
.build();
64+
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqParameter() {
65+
return route("add_request_parameter_route")
66+
.route(host("{segment}.myhost.org"), http())
67+
.before(uri("https://example.org"))
68+
.before(addRequestParameter("foo", "bar-{segment}"))
69+
.build();
6470
}
6571
}
6672
----

docs/modules/ROOT/pages/spring-cloud-gateway-server-webmvc/filters/addresponseheader.adoc

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ spring:
1414
routes:
1515
- id: add_response_header_route
1616
uri: https://example.org
17+
predicates:
18+
- Path=/anything/addresheader
1719
filters:
1820
- AddResponseHeader=X-Response-Red, Blue
1921
----
2022

2123
.GatewaySampleApplication.java
2224
[source,java]
2325
----
26+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
2427
import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFunctions.addResponseHeader;
2528
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
2629
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -30,9 +33,10 @@ class RouteConfiguration {
3033
3134
@Bean
3235
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddRespHeader() {
33-
return route("addresponseheader")
34-
.GET("/anything/addresheader", http("https://example.org"))
35-
.after(addResponseHeader("X-Response-Red", "Blue"))
36+
return route("add_response_header_route")
37+
.GET("/anything/addresheader", http())
38+
.before(uri("https://example.org"))
39+
.after(addResponseHeader("X-Response-Red", "Blue"))
3640
.build();
3741
}
3842
}
@@ -47,6 +51,7 @@ The following example configures an `AddResponseHeader` filter that uses a varia
4751
.GatewaySampleApplication.java
4852
[source,java]
4953
----
54+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
5055
import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFunctions.addResponseHeader;
5156
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
5257
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -57,10 +62,11 @@ class RouteConfiguration {
5762
5863
@Bean
5964
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddRespHeader() {
60-
return route("add_response_header_route")
61-
.route(host("{segment}.myhost.org"), http("https://example.org"))
62-
.after(addResponseHeader("foo", "bar-{segment}"))
63-
.build();
65+
return route("add_response_header_route")
66+
.route(host("{segment}.myhost.org"), http())
67+
.before(uri("https://example.org"))
68+
.after(addResponseHeader("foo", "bar-{segment}"))
69+
.build();
6470
}
6571
}
6672
----

docs/modules/ROOT/pages/spring-cloud-gateway-server-webmvc/filters/circuitbreaker-filter.adoc

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@ spring:
1515
gateway:
1616
mvc:
1717
routes:
18-
- id: circuitbreaker_route
18+
- id: circuitbreakernofallback
1919
uri: https://example.org
20+
predicates:
21+
- Path=/anything/circuitbreakernofallback
2022
filters:
2123
- CircuitBreaker=myCircuitBreaker
2224
----
2325
.GatewaySampleApplication.java
2426
[source,java]
2527
----
28+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
2629
import static org.springframework.cloud.gateway.server.mvc.filter.CircuitBreakerFilterFunctions.circuitBreaker;
2730
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
2831
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -33,9 +36,10 @@ class RouteConfiguration {
3336
@Bean
3437
public RouterFunction<ServerResponse> gatewayRouterFunctionsCircuitBreakerNoFallback() {
3538
return route("circuitbreakernofallback")
36-
.route(path("/anything/circuitbreakernofallback"), http("https://example.org"))
37-
.filter(circuitBreaker("mycb3"))
38-
.build();
39+
.route(path("/anything/circuitbreakernofallback"), http())
40+
.before(uri("https://example.org"))
41+
.filter(circuitBreaker("myCircuitBreaker"))
42+
.build();
3943
}
4044
}
4145
----
@@ -74,6 +78,7 @@ The following listing does the same thing in Java:
7478
[source,java]
7579
----
7680
import java.net.URI;
81+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
7782
import static org.springframework.cloud.gateway.server.mvc.filter.CircuitBreakerFilterFunctions.circuitBreaker;
7883
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
7984
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -84,9 +89,10 @@ class RouteConfiguration {
8489
@Bean
8590
public RouterFunction<ServerResponse> gatewayRouterFunctionsCircuitBreakerFallback() {
8691
return route("circuitbreaker_route")
87-
.route(path("/consumingServiceEndpoint"), http("https://example.org"))
88-
.filter(circuitBreaker("myCircuitBreaker", URI.create("forward:/inCaseOfFailureUseThis")))
89-
.build();
92+
.route(path("/consumingServiceEndpoint"), http())
93+
.before(uri("https://example.org"))
94+
.filter(circuitBreaker("myCircuitBreaker", URI.create("forward:/inCaseOfFailureUseThis")))
95+
.build();
9096
}
9197
}
9298
----
@@ -102,6 +108,7 @@ In the example below the call `consumingServiceEndpoint/users/1` will be redirec
102108
[source,java]
103109
----
104110
import java.net.URI;
111+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
105112
import static org.springframework.cloud.gateway.server.mvc.filter.CircuitBreakerFilterFunctions.circuitBreaker;
106113
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
107114
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@@ -112,9 +119,10 @@ class RouteConfiguration {
112119
@Bean
113120
public RouterFunction<ServerResponse> gatewayRouterFunctionsCircuitBreakerFallback() {
114121
return route("circuitbreaker_route")
115-
.route(path("/consumingServiceEndpoint/{*segments}"), http("https://example.org"))
116-
.filter(circuitBreaker("myCircuitBreaker", URI.create("forward:/inCaseOfFailureUseThis/{segments}")))
117-
.build();
122+
.route(path("/consumingServiceEndpoint/{*segments}"), http())
123+
.before(uri("https://example.org"))
124+
.filter(circuitBreaker("myCircuitBreaker", URI.create("forward:/inCaseOfFailureUseThis/{segments}")))
125+
.build();
118126
}
119127
}
120128
----
@@ -126,6 +134,7 @@ However, you can also reroute the request to a controller or handler in an exter
126134
.GatewaySampleApplication.java
127135
[source,java]
128136
----
137+
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
129138
import static org.springframework.cloud.gateway.server.mvc.filter.CircuitBreakerFilterFunctions.circuitBreaker;
130139
import static org.springframework.cloud.gateway.server.mvc.filter.LoadBalancerFilterFunctions.lb;
131140
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
@@ -142,7 +151,8 @@ class RouteConfiguration {
142151
.filter(circuitBreaker("fetchIngredients", URI.create("forward:/fallback")))
143152
.build()
144153
.and(route("ingredients-fallback")
145-
.route(path("/fallback"), http("http://localhost:9994"))
154+
.route(path("/fallback"), http())
155+
.before(uri("https://localhost:9994"))
146156
.build());
147157
}
148158
}

0 commit comments

Comments
 (0)