1
1
/*
2
- * Copyright 2013-2024 the original author or authors.
3
- *
2
+ * Copyright 2013-2025
4
3
* Licensed under the Apache License, Version 2.0 (the "License");
5
4
* you may not use this file except in compliance with the License.
6
5
* You may obtain a copy of the License at
34
33
import org .springframework .boot .http .client .ClientHttpRequestFactoryBuilder ;
35
34
import org .springframework .boot .http .client .ClientHttpRequestFactorySettings ;
36
35
import org .springframework .boot .http .client .SimpleClientHttpRequestFactoryBuilder ;
36
+ import org .springframework .boot .test .context .FilteredClassLoader ;
37
37
import org .springframework .boot .test .context .runner .ApplicationContextRunner ;
38
38
import org .springframework .cloud .gateway .server .mvc .filter .FilterAutoConfiguration ;
39
39
import org .springframework .cloud .gateway .server .mvc .filter .FormFilter ;
47
47
import org .springframework .cloud .gateway .server .mvc .filter .XForwardedRequestHeadersFilter ;
48
48
import org .springframework .cloud .gateway .server .mvc .handler .HandlerFunctionAutoConfiguration ;
49
49
import org .springframework .cloud .gateway .server .mvc .predicate .PredicateAutoConfiguration ;
50
+ import org .springframework .cloud .loadbalancer .annotation .LoadBalancerClient ;
50
51
import org .springframework .context .ConfigurableApplicationContext ;
51
52
52
53
import static org .assertj .core .api .Assertions .assertThat ;
@@ -76,7 +77,7 @@ public class GatewayServerMvcAutoConfigurationTests {
76
77
fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z
77
78
ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ==
78
79
-----END CERTIFICATE-----
79
- """ ;
80
+ """ ;
80
81
81
82
private static final String key = """
82
83
-----BEGIN PRIVATE KEY-----
@@ -112,44 +113,44 @@ public class GatewayServerMvcAutoConfigurationTests {
112
113
@ Test
113
114
void filterEnabledPropertiesWork () {
114
115
new ApplicationContextRunner ()
115
- .withConfiguration (AutoConfigurations .of (FilterAutoConfiguration .class , PredicateAutoConfiguration .class ,
116
- HandlerFunctionAutoConfiguration .class , GatewayServerMvcAutoConfiguration .class ,
117
- HttpClientAutoConfiguration .class , RestTemplateAutoConfiguration .class ,
118
- RestClientAutoConfiguration .class , SslAutoConfiguration .class ))
119
- .withPropertyValues ("spring.cloud.gateway.mvc.form-filter.enabled=false" ,
120
- "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false" ,
121
- "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false" ,
122
- "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false" ,
123
- "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false" ,
124
- "spring.cloud.gateway.mvc.remove-http2-status-response-headers-filter.enabled=false" ,
125
- "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false" ,
126
- "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false" ,
127
- "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false" )
128
- .run (context -> {
129
- assertThat (context ).doesNotHaveBean (FormFilter .class );
130
- assertThat (context ).doesNotHaveBean (ForwardedRequestHeadersFilter .class );
131
- assertThat (context ).doesNotHaveBean (RemoveContentLengthRequestHeadersFilter .class );
132
- assertThat (context ).doesNotHaveBean (RemoveHopByHopRequestHeadersFilter .class );
133
- assertThat (context ).doesNotHaveBean (RemoveHopByHopResponseHeadersFilter .class );
134
- assertThat (context ).doesNotHaveBean (RemoveHttp2StatusResponseHeadersFilter .class );
135
- assertThat (context ).doesNotHaveBean (TransferEncodingNormalizationRequestHeadersFilter .class );
136
- assertThat (context ).doesNotHaveBean (WeightCalculatorFilter .class );
137
- assertThat (context ).doesNotHaveBean (XForwardedRequestHeadersFilter .class );
138
- });
116
+ .withConfiguration (AutoConfigurations .of (FilterAutoConfiguration .class , PredicateAutoConfiguration .class ,
117
+ HandlerFunctionAutoConfiguration .class , GatewayServerMvcAutoConfiguration .class ,
118
+ HttpClientAutoConfiguration .class , RestTemplateAutoConfiguration .class ,
119
+ RestClientAutoConfiguration .class , SslAutoConfiguration .class ))
120
+ .withPropertyValues ("spring.cloud.gateway.mvc.form-filter.enabled=false" ,
121
+ "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false" ,
122
+ "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false" ,
123
+ "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false" ,
124
+ "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false" ,
125
+ "spring.cloud.gateway.mvc.remove-http2-status-response-headers-filter.enabled=false" ,
126
+ "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false" ,
127
+ "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false" ,
128
+ "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false" )
129
+ .run (context -> {
130
+ assertThat (context ).doesNotHaveBean (FormFilter .class );
131
+ assertThat (context ).doesNotHaveBean (ForwardedRequestHeadersFilter .class );
132
+ assertThat (context ).doesNotHaveBean (RemoveContentLengthRequestHeadersFilter .class );
133
+ assertThat (context ).doesNotHaveBean (RemoveHopByHopRequestHeadersFilter .class );
134
+ assertThat (context ).doesNotHaveBean (RemoveHopByHopResponseHeadersFilter .class );
135
+ assertThat (context ).doesNotHaveBean (RemoveHttp2StatusResponseHeadersFilter .class );
136
+ assertThat (context ).doesNotHaveBean (TransferEncodingNormalizationRequestHeadersFilter .class );
137
+ assertThat (context ).doesNotHaveBean (WeightCalculatorFilter .class );
138
+ assertThat (context ).doesNotHaveBean (XForwardedRequestHeadersFilter .class );
139
+ });
139
140
}
140
141
141
142
@ DisabledForJreRange (min = JRE .JAVA_23 )
142
143
@ Test
143
144
void gatewayHttpClientPropertiesWork () {
144
145
ConfigurableApplicationContext context = new SpringApplicationBuilder (TestConfig .class )
145
- .properties ("spring.main.web-application-type=none" ,
146
- "spring.cloud.gateway.mvc.http-client.connect-timeout=1s" ,
147
- "spring.cloud.gateway.mvc.http-client.read-timeout=2s" ,
148
- "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle" ,
149
- "spring.cloud.gateway.mvc.http-client.type=autodetect" ,
150
- "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert ,
151
- "spring.ssl.bundle.pem.mybundle.keystore.key=" + key )
152
- .run ();
146
+ .properties ("spring.main.web-application-type=none" ,
147
+ "spring.cloud.gateway.mvc.http-client.connect-timeout=1s" ,
148
+ "spring.cloud.gateway.mvc.http-client.read-timeout=2s" ,
149
+ "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle" ,
150
+ "spring.cloud.gateway.mvc.http-client.type=autodetect" ,
151
+ "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert ,
152
+ "spring.ssl.bundle.pem.mybundle.keystore.key=" + key )
153
+ .run ();
153
154
ClientHttpRequestFactorySettings settings = context .getBean (ClientHttpRequestFactorySettings .class );
154
155
HttpClientProperties properties = context .getBean (HttpClientProperties .class );
155
156
assertThat (properties .getConnectTimeout ()).hasSeconds (1 );
@@ -165,39 +166,60 @@ void gatewayHttpClientPropertiesWork() {
165
166
@ Test
166
167
void bootHttpClientPropertiesWork () {
167
168
new ApplicationContextRunner ()
168
- .withConfiguration (AutoConfigurations .of (FilterAutoConfiguration .class , PredicateAutoConfiguration .class ,
169
- HandlerFunctionAutoConfiguration .class , GatewayServerMvcAutoConfiguration .class ,
170
- HttpClientAutoConfiguration .class , RestTemplateAutoConfiguration .class ,
171
- RestClientAutoConfiguration .class , SslAutoConfiguration .class ))
172
- .withPropertyValues ("spring.http.client.connect-timeout=1s" , "spring.http.client.read-timeout=2s" ,
173
- "spring.http.client.ssl.bundle=mybundle" ,
174
- "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert ,
175
- "spring.ssl.bundle.pem.mybundle.keystore.key=" + key )
176
- .run (context -> {
177
- assertThat (context ).hasSingleBean (ClientHttpRequestFactorySettings .class )
178
- .hasSingleBean (HttpClientProperties .class );
179
- HttpClientProperties httpClient = context .getBean (HttpClientProperties .class );
180
- assertThat (httpClient .getConnectTimeout ()).hasSeconds (1 );
181
- assertThat (httpClient .getReadTimeout ()).hasSeconds (2 );
182
- assertThat (httpClient .getSsl ().getBundle ()).isEqualTo ("mybundle" );
183
- assertThat (httpClient .getFactory ()).isNull ();
184
- ClientHttpRequestFactorySettings settings = context .getBean (ClientHttpRequestFactorySettings .class );
185
- assertThat (settings .readTimeout ()).isEqualTo (Duration .ofSeconds (2 ));
186
- assertThat (settings .connectTimeout ()).isEqualTo (Duration .ofSeconds (1 ));
187
- assertThat (settings .sslBundle ()).isNotNull ();
188
- // cant test redirects because EnvironmentPostProcessor is not run
189
- });
169
+ .withConfiguration (AutoConfigurations .of (FilterAutoConfiguration .class , PredicateAutoConfiguration .class ,
170
+ HandlerFunctionAutoConfiguration .class , GatewayServerMvcAutoConfiguration .class ,
171
+ HttpClientAutoConfiguration .class , RestTemplateAutoConfiguration .class ,
172
+ RestClientAutoConfiguration .class , SslAutoConfiguration .class ))
173
+ .withPropertyValues ("spring.http.client.connect-timeout=1s" , "spring.http.client.read-timeout=2s" ,
174
+ "spring.http.client.ssl.bundle=mybundle" ,
175
+ "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert ,
176
+ "spring.ssl.bundle.pem.mybundle.keystore.key=" + key )
177
+ .run (context -> {
178
+ assertThat (context ).hasSingleBean (ClientHttpRequestFactorySettings .class )
179
+ .hasSingleBean (HttpClientProperties .class );
180
+ HttpClientProperties httpClient = context .getBean (HttpClientProperties .class );
181
+ assertThat (httpClient .getConnectTimeout ()).hasSeconds (1 );
182
+ assertThat (httpClient .getReadTimeout ()).hasSeconds (2 );
183
+ assertThat (httpClient .getSsl ().getBundle ()).isEqualTo ("mybundle" );
184
+ assertThat (httpClient .getFactory ()).isNull ();
185
+ ClientHttpRequestFactorySettings settings = context .getBean (ClientHttpRequestFactorySettings .class );
186
+ assertThat (settings .readTimeout ()).isEqualTo (Duration .ofSeconds (2 ));
187
+ assertThat (settings .connectTimeout ()).isEqualTo (Duration .ofSeconds (1 ));
188
+ assertThat (settings .sslBundle ()).isNotNull ();
189
+ // cant test redirects because EnvironmentPostProcessor is not run
190
+ });
190
191
}
191
192
192
193
@ Test
193
194
void settingHttpClientFactoryWorks () {
194
195
ConfigurableApplicationContext context = new SpringApplicationBuilder (TestConfig .class )
195
- .properties ("spring.main.web-application-type=none" , "spring.http.client.factory=simple" )
196
- .run ();
196
+ .properties ("spring.main.web-application-type=none" , "spring.http.client.factory=simple" )
197
+ .run ();
197
198
ClientHttpRequestFactoryBuilder <?> builder = context .getBean (ClientHttpRequestFactoryBuilder .class );
198
199
assertThat (builder ).isInstanceOf (SimpleClientHttpRequestFactoryBuilder .class );
199
200
}
200
201
202
+ @ Test
203
+ void loadBalancerFunctionHandlerAdded () {
204
+ new ApplicationContextRunner ()
205
+ .withConfiguration (AutoConfigurations .of (FilterAutoConfiguration .class , PredicateAutoConfiguration .class ,
206
+ HandlerFunctionAutoConfiguration .class , GatewayServerMvcAutoConfiguration .class ,
207
+ HttpClientAutoConfiguration .class , RestTemplateAutoConfiguration .class ,
208
+ RestClientAutoConfiguration .class ))
209
+ .run (context -> assertThat (context ).hasBean ("lbHandlerFunctionDefinition" ));
210
+ }
211
+
212
+ @ Test
213
+ void loadBalancerFunctionHandlerNotAddedWhenNoLoadBalancerClientOnClasspath () {
214
+ new ApplicationContextRunner ()
215
+ .withConfiguration (AutoConfigurations .of (FilterAutoConfiguration .class , PredicateAutoConfiguration .class ,
216
+ HandlerFunctionAutoConfiguration .class , GatewayServerMvcAutoConfiguration .class ,
217
+ HttpClientAutoConfiguration .class , RestTemplateAutoConfiguration .class ,
218
+ RestClientAutoConfiguration .class ))
219
+ .withClassLoader (new FilteredClassLoader (LoadBalancerClient .class ))
220
+ .run (context -> assertThat (context ).doesNotHaveBean ("lbHandlerFunctionDefinition" ));
221
+ }
222
+
201
223
@ SpringBootConfiguration
202
224
@ EnableAutoConfiguration
203
225
static class TestConfig {
0 commit comments