Skip to content

Commit 5512404

Browse files
committed
Deprecates GatewayMvcProperties.HttpClient
In favor of spring.http.client properties from Spring Boot 3.4.0
1 parent 9adea63 commit 5512404

File tree

5 files changed

+142
-82
lines changed

5 files changed

+142
-82
lines changed

spring-cloud-gateway-server-mvc/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@
8484
<artifactId>spring-boot-starter-test</artifactId>
8585
<scope>test</scope>
8686
</dependency>
87+
<dependency>
88+
<groupId>org.springframework.boot</groupId>
89+
<artifactId>spring-boot-properties-migrator</artifactId>
90+
<scope>test</scope>
91+
</dependency>
8792
<!-- Third party test dependencies -->
8893
<dependency>
8994
<groupId>com.bucket4j</groupId>

spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
import org.springframework.boot.autoconfigure.AutoConfiguration;
2121
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
23+
import org.springframework.boot.autoconfigure.http.client.HttpClientAutoConfiguration;
24+
import org.springframework.boot.autoconfigure.http.client.HttpClientProperties;
2325
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2426
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
2527
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
2628
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
29+
import org.springframework.boot.http.client.JdkClientHttpRequestFactoryBuilder;
2730
import org.springframework.boot.ssl.SslBundle;
2831
import org.springframework.boot.ssl.SslBundles;
2932
import org.springframework.boot.web.client.RestClientCustomizer;
@@ -63,7 +66,8 @@
6366
* @author Spencer Gibb
6467
* @author Jürgen Wißkirchen
6568
*/
66-
@AutoConfiguration(after = { RestTemplateAutoConfiguration.class, RestClientAutoConfiguration.class })
69+
@AutoConfiguration(after = { HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class,
70+
RestClientAutoConfiguration.class })
6771
@ConditionalOnProperty(name = "spring.cloud.gateway.mvc.enabled", matchIfMissing = true)
6872
@Import(GatewayMvcPropertiesBeanDefinitionRegistrar.class)
6973
@ImportRuntimeHints(GatewayMvcAotRuntimeHintsRegistrar.class)
@@ -109,20 +113,20 @@ public ForwardedRequestHeadersFilter forwardedRequestHeadersFilter() {
109113

110114
@Bean
111115
@ConditionalOnMissingBean
112-
public ClientHttpRequestFactory gatewayClientHttpRequestFactory(GatewayMvcProperties gatewayMvcProperties,
116+
public ClientHttpRequestFactory gatewayClientHttpRequestFactory(HttpClientProperties properties,
113117
SslBundles sslBundles) {
114-
GatewayMvcProperties.HttpClient properties = gatewayMvcProperties.getHttpClient();
115118

116119
SslBundle sslBundle = null;
117-
if (StringUtils.hasText(properties.getSslBundle())) {
118-
sslBundle = sslBundles.getBundle(properties.getSslBundle());
120+
if (StringUtils.hasText(properties.getSsl().getBundle())) {
121+
sslBundle = sslBundles.getBundle(properties.getSsl().getBundle());
119122
}
120123
ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.ofSslBundle(sslBundle)
121124
.withConnectTimeout(properties.getConnectTimeout())
122125
.withReadTimeout(properties.getReadTimeout())
123126
.withRedirects(ClientHttpRequestFactorySettings.Redirects.DONT_FOLLOW);
124127

125-
if (properties.getType() == GatewayMvcProperties.HttpClientType.JDK) {
128+
ClientHttpRequestFactoryBuilder<?> builder = ClientHttpRequestFactoryBuilder.detect();
129+
if (builder instanceof JdkClientHttpRequestFactoryBuilder) {
126130
// TODO: customize restricted headers
127131
String restrictedHeaders = System.getProperty("jdk.httpclient.allowRestrictedHeaders");
128132
if (!StringUtils.hasText(restrictedHeaders)) {
@@ -131,12 +135,10 @@ public ClientHttpRequestFactory gatewayClientHttpRequestFactory(GatewayMvcProper
131135
else if (StringUtils.hasText(restrictedHeaders) && !restrictedHeaders.contains("host")) {
132136
System.setProperty("jdk.httpclient.allowRestrictedHeaders", restrictedHeaders + ",host");
133137
}
134-
135-
return ClientHttpRequestFactoryBuilder.jdk().build(settings);
136138
}
137139

138140
// Autodetect
139-
return ClientHttpRequestFactoryBuilder.detect().build(settings);
141+
return builder.build(settings);
140142
}
141143

142144
@Bean

spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import jakarta.validation.constraints.NotNull;
2727

2828
import org.springframework.boot.context.properties.ConfigurationProperties;
29+
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
2930
import org.springframework.core.style.ToStringCreator;
3031
import org.springframework.http.MediaType;
3132

@@ -111,6 +112,10 @@ public String toString() {
111112
.toString();
112113
}
113114

115+
/**
116+
* @deprecated in favor of spring.http.client.
117+
*/
118+
@Deprecated
114119
public static class HttpClient {
115120

116121
/** The HttpClient connect timeout. */
@@ -125,6 +130,8 @@ public static class HttpClient {
125130
/** The HttpClient type. Defaults to JDK. */
126131
private HttpClientType type = HttpClientType.JDK;
127132

133+
@Deprecated
134+
@DeprecatedConfigurationProperty(replacement = "spring.http.client.connect-timeout", since = "4.2.0")
128135
public Duration getConnectTimeout() {
129136
return connectTimeout;
130137
}
@@ -133,6 +140,8 @@ public void setConnectTimeout(Duration connectTimeout) {
133140
this.connectTimeout = connectTimeout;
134141
}
135142

143+
@Deprecated
144+
@DeprecatedConfigurationProperty(replacement = "spring.http.client.read-timeout", since = "4.2.0")
136145
public Duration getReadTimeout() {
137146
return readTimeout;
138147
}
@@ -141,6 +150,8 @@ public void setReadTimeout(Duration readTimeout) {
141150
this.readTimeout = readTimeout;
142151
}
143152

153+
@Deprecated
154+
@DeprecatedConfigurationProperty(replacement = "spring.http.client.ssl.bundle", since = "4.2.0")
144155
public String getSslBundle() {
145156
return sslBundle;
146157
}
@@ -149,6 +160,7 @@ public void setSslBundle(String sslBundle) {
149160
this.sslBundle = sslBundle;
150161
}
151162

163+
@Deprecated
152164
public HttpClientType getType() {
153165
return type;
154166
}

spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java

Lines changed: 112 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,20 @@
1616

1717
package org.springframework.cloud.gateway.server.mvc;
1818

19+
import java.time.Duration;
20+
1921
import org.junit.jupiter.api.Test;
2022

23+
import org.springframework.boot.SpringBootConfiguration;
2124
import org.springframework.boot.autoconfigure.AutoConfigurations;
25+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2226
import org.springframework.boot.autoconfigure.http.client.HttpClientAutoConfiguration;
27+
import org.springframework.boot.autoconfigure.http.client.HttpClientProperties;
2328
import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration;
2429
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2530
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
31+
import org.springframework.boot.builder.SpringApplicationBuilder;
2632
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
27-
import org.springframework.cloud.gateway.server.mvc.config.GatewayMvcProperties;
2833
import org.springframework.cloud.gateway.server.mvc.filter.FormFilter;
2934
import org.springframework.cloud.gateway.server.mvc.filter.ForwardedRequestHeadersFilter;
3035
import org.springframework.cloud.gateway.server.mvc.filter.RemoveContentLengthRequestHeadersFilter;
@@ -34,72 +39,76 @@
3439
import org.springframework.cloud.gateway.server.mvc.filter.TransferEncodingNormalizationRequestHeadersFilter;
3540
import org.springframework.cloud.gateway.server.mvc.filter.WeightCalculatorFilter;
3641
import org.springframework.cloud.gateway.server.mvc.filter.XForwardedRequestHeadersFilter;
42+
import org.springframework.context.ConfigurableApplicationContext;
43+
import org.springframework.http.client.JdkClientHttpRequestFactory;
44+
import org.springframework.test.util.ReflectionTestUtils;
3745

3846
import static org.assertj.core.api.Assertions.assertThat;
3947

4048
public class GatewayServerMvcAutoConfigurationTests {
4149

4250
private static final String cert = """
43-
-----BEGIN CERTIFICATE-----
44-
MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE
45-
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP
46-
MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs
47-
aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE
48-
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP
49-
MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs
50-
aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD
51-
+m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu
52-
sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D
53-
nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ
54-
11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP
55-
fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb
56-
UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG
57-
A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq
58-
hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld
59-
hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6
60-
gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b
61-
dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8
62-
fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z
63-
ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ==
64-
-----END CERTIFICATE-----
65-
""";
51+
-----BEGIN CERTIFICATE-----
52+
MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE
53+
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP
54+
MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs
55+
aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE
56+
BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP
57+
MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs
58+
aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD
59+
+m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu
60+
sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D
61+
nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ
62+
11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP
63+
fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb
64+
UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG
65+
A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq
66+
hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld
67+
hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6
68+
gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b
69+
dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8
70+
fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z
71+
ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ==
72+
-----END CERTIFICATE-----
73+
""";
6674

6775
private static final String key = """
68-
-----BEGIN PRIVATE KEY-----
69-
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD8B1saBN8Y0ZjX
70-
Q/pvnv2hZa+cBBkFHVkgw+tdzgdcO5Kjv2rnRKd3Oh8Qwdxj3BC9GpicF4GOgkDG
71-
LrMrYbmV/xGUnNh3YpUwbv+U/pm3VnuSZCk4aYgNEWHrnEHyrge87+MqYqGuMIke
72-
A5z7GV44PeThfKQs2BLLL/ME+Pb/jN6IVlIHxdBT5TBQkqNGFU7swdZoQ5Viqv44
73-
UNdVqU5pP3UF/perbOm2CHCbeLiLRvmuvGuBbrbko2XUwBNH+UjmEQaRh/epoy8B
74-
D31vGY87ym/YOEdpIrqD8bwg7NWP/Fdsryqi8p+U8fcfw4xZjotA0Sv04BC7zXHg
75-
m1AyZoVzAgMBAAECggEAfEqiZqANaF+BqXQIb4Dw42ZTJzWsIyYYnPySOGZRoe5t
76-
QJ03uwtULYv34xtANe1DQgd6SMyc46ugBzzjtprQ3ET5Jhn99U6kdcjf+dpf85dO
77-
hOEppP0CkDNI39nleinSfh6uIOqYgt/D143/nqQhn8oCdSOzkbwT9KnWh1bC9T7I
78-
vFjGfElvt1/xl88qYgrWgYLgXaencNGgiv/4/M0FNhiHEGsVC7SCu6kapC/WIQpE
79-
5IdV+HR+tiLoGZhXlhqorY7QC4xKC4wwafVSiFxqDOQAuK+SMD4TCEv0Aop+c+SE
80-
YBigVTmgVeJkjK7IkTEhKkAEFmRF5/5w+bZD9FhTNQKBgQD+4fNG1ChSU8RdizZT
81-
5dPlDyAxpETSCEXFFVGtPPh2j93HDWn7XugNyjn5FylTH507QlabC+5wZqltdIjK
82-
GRB5MIinQ9/nR2fuwGc9s+0BiSEwNOUB1MWm7wWL/JUIiKq6sTi6sJIfsYg79zco
83-
qxl5WE94aoINx9Utq1cdWhwJTQKBgQD9IjPksd4Jprz8zMrGLzR8k1gqHyhv24qY
84-
EJ7jiHKKAP6xllTUYwh1IBSL6w2j5lfZPpIkb4Jlk2KUoX6fN81pWkBC/fTBUSIB
85-
EHM9bL51+yKEYUbGIy/gANuRbHXsWg3sjUsFTNPN4hGTFk3w2xChCyl/f5us8Lo8
86-
Z633SNdpvwKBgQCGyDU9XzNzVZihXtx7wS0sE7OSjKtX5cf/UCbA1V0OVUWR3SYO
87-
J0HPCQFfF0BjFHSwwYPKuaR9C8zMdLNhK5/qdh/NU7czNi9fsZ7moh7SkRFbzJzN
88-
OxbKD9t/CzJEMQEXeF/nWTfsSpUgILqqZtAxuuFLbAcaAnJYlCKdAumQgQKBgQCK
89-
mqjJh68pn7gJwGUjoYNe1xtGbSsqHI9F9ovZ0MPO1v6e5M7sQJHH+Fnnxzv/y8e8
90-
d6tz8e73iX1IHymDKv35uuZHCGF1XOR+qrA/KQUc+vcKf21OXsP/JtkTRs1HLoRD
91-
S5aRf2DWcfvniyYARSNU2xTM8GWgi2ueWbMDHUp+ZwKBgA/swC+K+Jg5DEWm6Sau
92-
e6y+eC6S+SoXEKkI3wf7m9aKoZo0y+jh8Gas6gratlc181pSM8O3vZG0n19b493I
93-
apCFomMLE56zEzvyzfpsNhFhk5MBMCn0LPyzX6MiynRlGyWIj0c99fbHI3pOMufP
94-
WgmVLTZ8uDcSW1MbdUCwFSk5
95-
-----END PRIVATE KEY-----
96-
""";
76+
-----BEGIN PRIVATE KEY-----
77+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD8B1saBN8Y0ZjX
78+
Q/pvnv2hZa+cBBkFHVkgw+tdzgdcO5Kjv2rnRKd3Oh8Qwdxj3BC9GpicF4GOgkDG
79+
LrMrYbmV/xGUnNh3YpUwbv+U/pm3VnuSZCk4aYgNEWHrnEHyrge87+MqYqGuMIke
80+
A5z7GV44PeThfKQs2BLLL/ME+Pb/jN6IVlIHxdBT5TBQkqNGFU7swdZoQ5Viqv44
81+
UNdVqU5pP3UF/perbOm2CHCbeLiLRvmuvGuBbrbko2XUwBNH+UjmEQaRh/epoy8B
82+
D31vGY87ym/YOEdpIrqD8bwg7NWP/Fdsryqi8p+U8fcfw4xZjotA0Sv04BC7zXHg
83+
m1AyZoVzAgMBAAECggEAfEqiZqANaF+BqXQIb4Dw42ZTJzWsIyYYnPySOGZRoe5t
84+
QJ03uwtULYv34xtANe1DQgd6SMyc46ugBzzjtprQ3ET5Jhn99U6kdcjf+dpf85dO
85+
hOEppP0CkDNI39nleinSfh6uIOqYgt/D143/nqQhn8oCdSOzkbwT9KnWh1bC9T7I
86+
vFjGfElvt1/xl88qYgrWgYLgXaencNGgiv/4/M0FNhiHEGsVC7SCu6kapC/WIQpE
87+
5IdV+HR+tiLoGZhXlhqorY7QC4xKC4wwafVSiFxqDOQAuK+SMD4TCEv0Aop+c+SE
88+
YBigVTmgVeJkjK7IkTEhKkAEFmRF5/5w+bZD9FhTNQKBgQD+4fNG1ChSU8RdizZT
89+
5dPlDyAxpETSCEXFFVGtPPh2j93HDWn7XugNyjn5FylTH507QlabC+5wZqltdIjK
90+
GRB5MIinQ9/nR2fuwGc9s+0BiSEwNOUB1MWm7wWL/JUIiKq6sTi6sJIfsYg79zco
91+
qxl5WE94aoINx9Utq1cdWhwJTQKBgQD9IjPksd4Jprz8zMrGLzR8k1gqHyhv24qY
92+
EJ7jiHKKAP6xllTUYwh1IBSL6w2j5lfZPpIkb4Jlk2KUoX6fN81pWkBC/fTBUSIB
93+
EHM9bL51+yKEYUbGIy/gANuRbHXsWg3sjUsFTNPN4hGTFk3w2xChCyl/f5us8Lo8
94+
Z633SNdpvwKBgQCGyDU9XzNzVZihXtx7wS0sE7OSjKtX5cf/UCbA1V0OVUWR3SYO
95+
J0HPCQFfF0BjFHSwwYPKuaR9C8zMdLNhK5/qdh/NU7czNi9fsZ7moh7SkRFbzJzN
96+
OxbKD9t/CzJEMQEXeF/nWTfsSpUgILqqZtAxuuFLbAcaAnJYlCKdAumQgQKBgQCK
97+
mqjJh68pn7gJwGUjoYNe1xtGbSsqHI9F9ovZ0MPO1v6e5M7sQJHH+Fnnxzv/y8e8
98+
d6tz8e73iX1IHymDKv35uuZHCGF1XOR+qrA/KQUc+vcKf21OXsP/JtkTRs1HLoRD
99+
S5aRf2DWcfvniyYARSNU2xTM8GWgi2ueWbMDHUp+ZwKBgA/swC+K+Jg5DEWm6Sau
100+
e6y+eC6S+SoXEKkI3wf7m9aKoZo0y+jh8Gas6gratlc181pSM8O3vZG0n19b493I
101+
apCFomMLE56zEzvyzfpsNhFhk5MBMCn0LPyzX6MiynRlGyWIj0c99fbHI3pOMufP
102+
WgmVLTZ8uDcSW1MbdUCwFSk5
103+
-----END PRIVATE KEY-----
104+
""";
97105

98106
@Test
99107
void filterEnabledPropertiesWork() {
100108
new ApplicationContextRunner()
101109
.withConfiguration(AutoConfigurations.of(GatewayServerMvcAutoConfiguration.class,
102-
RestTemplateAutoConfiguration.class, RestClientAutoConfiguration.class, SslAutoConfiguration.class))
110+
HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class,
111+
RestClientAutoConfiguration.class, SslAutoConfiguration.class))
103112
.withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false",
104113
"spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false",
105114
"spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false",
@@ -123,24 +132,55 @@ void filterEnabledPropertiesWork() {
123132
}
124133

125134
@Test
126-
void httpClientPropertiesWork() {
135+
void gatewayHttpClientPropertiesWork() {
136+
ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class)
137+
.properties("spring.main.web-application-type=none",
138+
"spring.cloud.gateway.mvc.http-client.connect-timeout=1s",
139+
"spring.cloud.gateway.mvc.http-client.connect-timeout=1s",
140+
"spring.cloud.gateway.mvc.http-client.read-timeout=2s",
141+
"spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle",
142+
"spring.cloud.gateway.mvc.http-client.type=autodetect",
143+
"spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert,
144+
"spring.ssl.bundle.pem.mybundle.keystore.key=" + key)
145+
.run();
146+
JdkClientHttpRequestFactory requestFactory = context.getBean(JdkClientHttpRequestFactory.class);
147+
HttpClientProperties properties = context.getBean(HttpClientProperties.class);
148+
assertThat(properties.getConnectTimeout()).hasSeconds(1);
149+
assertThat(properties.getReadTimeout()).hasSeconds(2);
150+
assertThat(properties.getSsl().getBundle()).isEqualTo("mybundle");
151+
assertThat(properties.getFactory()).isNull();
152+
Object readTimeout = ReflectionTestUtils.getField(requestFactory, "readTimeout");
153+
assertThat(readTimeout).isEqualTo(Duration.ofSeconds(2));
154+
}
155+
156+
@Test
157+
void bootHttpClientPropertiesWork() {
127158
new ApplicationContextRunner()
128-
.withConfiguration(AutoConfigurations.of(GatewayServerMvcAutoConfiguration.class, HttpClientAutoConfiguration.class,
129-
RestTemplateAutoConfiguration.class, RestClientAutoConfiguration.class, SslAutoConfiguration.class))
130-
.withPropertyValues("spring.cloud.gateway.mvc.http-client.connect-timeout=1s",
131-
"spring.cloud.gateway.mvc.http-client.read-timeout=2s",
132-
"spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle",
133-
"spring.cloud.gateway.mvc.http-client.type=autodetect",
134-
"spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert,
135-
"spring.ssl.bundle.pem.mybundle.keystore.key=" + key)
136-
.run(context -> {
137-
assertThat(context).hasSingleBean(GatewayMvcProperties.class);
138-
GatewayMvcProperties properties = context.getBean(GatewayMvcProperties.class);
139-
GatewayMvcProperties.HttpClient httpClient = properties.getHttpClient();
140-
assertThat(httpClient.getConnectTimeout()).hasSeconds(1);
141-
assertThat(httpClient.getReadTimeout()).hasSeconds(2);
142-
assertThat(httpClient.getSslBundle()).isEqualTo("mybundle");
143-
assertThat(httpClient.getType()).isEqualTo(GatewayMvcProperties.HttpClientType.AUTODETECT);
144-
});
159+
.withConfiguration(AutoConfigurations.of(GatewayServerMvcAutoConfiguration.class,
160+
HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class,
161+
RestClientAutoConfiguration.class, SslAutoConfiguration.class))
162+
.withPropertyValues("spring.http.client.connect-timeout=1s", "spring.http.client.read-timeout=2s",
163+
"spring.http.client.ssl.bundle=mybundle",
164+
"spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert,
165+
"spring.ssl.bundle.pem.mybundle.keystore.key=" + key)
166+
.run(context -> {
167+
assertThat(context).hasSingleBean(JdkClientHttpRequestFactory.class)
168+
.hasSingleBean(HttpClientProperties.class);
169+
HttpClientProperties httpClient = context.getBean(HttpClientProperties.class);
170+
assertThat(httpClient.getConnectTimeout()).hasSeconds(1);
171+
assertThat(httpClient.getReadTimeout()).hasSeconds(2);
172+
assertThat(httpClient.getSsl().getBundle()).isEqualTo("mybundle");
173+
assertThat(httpClient.getFactory()).isNull();
174+
JdkClientHttpRequestFactory requestFactory = context.getBean(JdkClientHttpRequestFactory.class);
175+
Object readTimeout = ReflectionTestUtils.getField(requestFactory, "readTimeout");
176+
assertThat(readTimeout).isEqualTo(Duration.ofSeconds(2));
177+
});
178+
}
179+
180+
@SpringBootConfiguration
181+
@EnableAutoConfiguration
182+
static class TestConfig {
183+
145184
}
185+
146186
}

spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/TestAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.cloud.gateway.server.mvc.test.client.DefaultTestRestClient;
2626
import org.springframework.context.ApplicationContext;
2727
import org.springframework.context.annotation.Bean;
28+
import org.springframework.context.annotation.Lazy;
2829
import org.springframework.core.env.Environment;
2930
import org.springframework.http.HttpHeaders;
3031
import org.springframework.http.MediaType;
@@ -46,7 +47,7 @@ RestTemplateCustomizer testRestClientRestTemplateCustomizer(ApplicationContext c
4647
}
4748

4849
@Bean
49-
public DefaultTestRestClient testRestClient(TestRestTemplate testRestTemplate, Environment env) {
50+
public DefaultTestRestClient testRestClient(@Lazy TestRestTemplate testRestTemplate, Environment env) {
5051
return new DefaultTestRestClient(testRestTemplate, new LocalHostUriBuilderFactory(env), result -> {
5152
});
5253
}

0 commit comments

Comments
 (0)