Skip to content

Commit 5a67f57

Browse files
committed
Replace calls to deprecated setConnectionTimeout method
Replace calls to the recently deprecated `setConnectionTimeout` method of `HttpComponentsClientHttpRequestFactoryBuilder`. This commit also introduces a `withConnectionConfigCustomizer` and allows connection timeouts settings to be used. Closes gh-48031
1 parent f1957a9 commit 5a67f57

File tree

6 files changed

+125
-58
lines changed

6 files changed

+125
-58
lines changed

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/client/HttpClientAutoConfigurationTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,20 @@ void configuresClientHttpRequestFactorySettings() {
7272
});
7373
}
7474

75+
@Test
76+
void configuresClientHttpRequestFactorySettingsUsingDeprecatedProperties() {
77+
this.contextRunner.withPropertyValues(sslPropertyValues().toArray(String[]::new))
78+
.withPropertyValues("spring.http.client.redirects=dont-follow", "spring.http.client.connect-timeout=10s",
79+
"spring.http.client.read-timeout=20s", "spring.http.client.ssl.bundle=test")
80+
.run((context) -> {
81+
ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class);
82+
assertThat(settings.redirects()).isEqualTo(Redirects.DONT_FOLLOW);
83+
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
84+
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
85+
assertThat(settings.sslBundle().getKey().getAlias()).isEqualTo("alias1");
86+
});
87+
}
88+
7589
private List<String> sslPropertyValues() {
7690
List<String> propertyValues = new ArrayList<>();
7791
String location = "classpath:org/springframework/boot/autoconfigure/ssl/";

spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import javax.net.ssl.SSLContext;
3131

3232
import org.apache.hc.client5.http.classic.HttpClient;
33+
import org.apache.hc.client5.http.config.ConnectionConfig;
3334
import org.apache.hc.client5.http.config.RequestConfig;
3435
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
3536
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
@@ -39,7 +40,6 @@
3940
import org.apache.hc.client5.http.protocol.HttpClientContext;
4041
import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
4142
import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
42-
import org.apache.hc.core5.http.io.SocketConfig;
4343
import org.apache.hc.core5.http.protocol.HttpContext;
4444
import org.apache.hc.core5.http.ssl.TLS;
4545
import org.apache.hc.core5.ssl.SSLContextBuilder;
@@ -1082,18 +1082,15 @@ public CustomHttpComponentsClientHttpRequestFactory(HttpClientOption[] httpClien
10821082
: StandardCookieSpec.IGNORE);
10831083
this.enableRedirects = settings.redirects() != Redirects.DONT_FOLLOW;
10841084
boolean ssl = HttpClientOption.SSL.isPresent(httpClientOptions);
1085-
if (settings.readTimeout() != null || ssl) {
1086-
setHttpClient(createHttpClient(settings.readTimeout(), ssl));
1087-
}
1088-
if (settings.connectTimeout() != null) {
1089-
setConnectTimeout((int) settings.connectTimeout().toMillis());
1085+
if (settings.connectTimeout() != null || settings.readTimeout() != null || ssl) {
1086+
setHttpClient(createHttpClient(settings.connectTimeout(), settings.readTimeout(), ssl));
10901087
}
10911088
}
10921089

1093-
private HttpClient createHttpClient(Duration readTimeout, boolean ssl) {
1090+
private HttpClient createHttpClient(Duration connectTimeout, Duration readTimeout, boolean ssl) {
10941091
try {
10951092
HttpClientBuilder builder = HttpClients.custom();
1096-
builder.setConnectionManager(createConnectionManager(readTimeout, ssl));
1093+
builder.setConnectionManager(createConnectionManager(connectTimeout, readTimeout, ssl));
10971094
builder.setDefaultRequestConfig(createRequestConfig());
10981095
return builder.build();
10991096
}
@@ -1102,18 +1099,23 @@ private HttpClient createHttpClient(Duration readTimeout, boolean ssl) {
11021099
}
11031100
}
11041101

1105-
private PoolingHttpClientConnectionManager createConnectionManager(Duration readTimeout, boolean ssl)
1102+
private PoolingHttpClientConnectionManager createConnectionManager(Duration connectTimeout,
1103+
Duration readTimeout, boolean ssl)
11061104
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
11071105
PoolingHttpClientConnectionManagerBuilder builder = PoolingHttpClientConnectionManagerBuilder.create();
1106+
if (connectTimeout != null || readTimeout != null) {
1107+
ConnectionConfig.Builder connectionConfig = ConnectionConfig.custom();
1108+
if (connectTimeout != null) {
1109+
connectionConfig.setConnectTimeout(connectTimeout.toMillis(), TimeUnit.MILLISECONDS);
1110+
}
1111+
if (readTimeout != null) {
1112+
connectionConfig.setSocketTimeout((int) readTimeout.toMillis(), TimeUnit.MILLISECONDS);
1113+
}
1114+
builder.setDefaultConnectionConfig(connectionConfig.build());
1115+
}
11081116
if (ssl) {
11091117
builder.setTlsSocketStrategy(createTlsSocketStrategy());
11101118
}
1111-
if (readTimeout != null) {
1112-
SocketConfig socketConfig = SocketConfig.custom()
1113-
.setSoTimeout((int) readTimeout.toMillis(), TimeUnit.MILLISECONDS)
1114-
.build();
1115-
builder.setDefaultSocketConfig(socketConfig);
1116-
}
11171119
return builder.build();
11181120
}
11191121

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/http/client/HttpComponentsClientHttpRequestFactoryBuilder.java

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.function.Function;
2727

2828
import org.apache.hc.client5.http.classic.HttpClient;
29+
import org.apache.hc.client5.http.config.ConnectionConfig;
2930
import org.apache.hc.client5.http.config.RequestConfig;
3031
import org.apache.hc.client5.http.impl.DefaultRedirectStrategy;
3132
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
@@ -65,13 +66,15 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
6566

6667
private final Consumer<SocketConfig.Builder> socketConfigCustomizer;
6768

69+
private final Consumer<ConnectionConfig.Builder> connectionConfigCustomizer;
70+
6871
private final Consumer<RequestConfig.Builder> defaultRequestConfigCustomizer;
6972

7073
private final Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory;
7174

7275
HttpComponentsClientHttpRequestFactoryBuilder() {
7376
this(Collections.emptyList(), emptyCustomizer(), emptyCustomizer(), emptyCustomizer(), emptyCustomizer(),
74-
HttpComponentsClientHttpRequestFactoryBuilder::createTlsSocketStrategy);
77+
emptyCustomizer(), HttpComponentsClientHttpRequestFactoryBuilder::createTlsSocketStrategy);
7578
}
7679

7780
private static TlsSocketStrategy createTlsSocketStrategy(SslBundle sslBundle) {
@@ -85,12 +88,14 @@ private HttpComponentsClientHttpRequestFactoryBuilder(
8588
Consumer<HttpClientBuilder> httpClientCustomizer,
8689
Consumer<PoolingHttpClientConnectionManagerBuilder> connectionManagerCustomizer,
8790
Consumer<SocketConfig.Builder> socketConfigCustomizer,
91+
Consumer<ConnectionConfig.Builder> connectionConfigCustomizer,
8892
Consumer<RequestConfig.Builder> defaultRequestConfigCustomizer,
8993
Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory) {
9094
super(customizers);
9195
this.httpClientCustomizer = httpClientCustomizer;
9296
this.connectionManagerCustomizer = connectionManagerCustomizer;
9397
this.socketConfigCustomizer = socketConfigCustomizer;
98+
this.connectionConfigCustomizer = connectionConfigCustomizer;
9499
this.defaultRequestConfigCustomizer = defaultRequestConfigCustomizer;
95100
this.tlsSocketStrategyFactory = tlsSocketStrategyFactory;
96101
}
@@ -100,15 +105,15 @@ public HttpComponentsClientHttpRequestFactoryBuilder withCustomizer(
100105
Consumer<HttpComponentsClientHttpRequestFactory> customizer) {
101106
return new HttpComponentsClientHttpRequestFactoryBuilder(mergedCustomizers(customizer),
102107
this.httpClientCustomizer, this.connectionManagerCustomizer, this.socketConfigCustomizer,
103-
this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
108+
this.connectionConfigCustomizer, this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
104109
}
105110

106111
@Override
107112
public HttpComponentsClientHttpRequestFactoryBuilder withCustomizers(
108113
Collection<Consumer<HttpComponentsClientHttpRequestFactory>> customizers) {
109114
return new HttpComponentsClientHttpRequestFactoryBuilder(mergedCustomizers(customizers),
110115
this.httpClientCustomizer, this.connectionManagerCustomizer, this.socketConfigCustomizer,
111-
this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
116+
this.connectionConfigCustomizer, this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
112117
}
113118

114119
/**
@@ -122,7 +127,8 @@ public HttpComponentsClientHttpRequestFactoryBuilder withHttpClientCustomizer(
122127
Assert.notNull(httpClientCustomizer, "'httpClientCustomizer' must not be null");
123128
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(),
124129
this.httpClientCustomizer.andThen(httpClientCustomizer), this.connectionManagerCustomizer,
125-
this.socketConfigCustomizer, this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
130+
this.socketConfigCustomizer, this.connectionConfigCustomizer, this.defaultRequestConfigCustomizer,
131+
this.tlsSocketStrategyFactory);
126132
}
127133

128134
/**
@@ -137,7 +143,7 @@ public HttpComponentsClientHttpRequestFactoryBuilder withConnectionManagerCustom
137143
Assert.notNull(connectionManagerCustomizer, "'connectionManagerCustomizer' must not be null");
138144
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
139145
this.connectionManagerCustomizer.andThen(connectionManagerCustomizer), this.socketConfigCustomizer,
140-
this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
146+
this.connectionConfigCustomizer, this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
141147
}
142148

143149
/**
@@ -152,6 +158,23 @@ public HttpComponentsClientHttpRequestFactoryBuilder withSocketConfigCustomizer(
152158
Assert.notNull(socketConfigCustomizer, "'socketConfigCustomizer' must not be null");
153159
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
154160
this.connectionManagerCustomizer, this.socketConfigCustomizer.andThen(socketConfigCustomizer),
161+
this.connectionConfigCustomizer, this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
162+
}
163+
164+
/**
165+
* Return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} that applies
166+
* additional customization to the underlying
167+
* {@link org.apache.hc.client5.http.config.ConnectionConfig.Builder}.
168+
* @param connectionConfigCustomizer the customizer to apply
169+
* @return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} instance
170+
* @since 3.4.12
171+
*/
172+
public HttpComponentsClientHttpRequestFactoryBuilder withConnectionConfigCustomizer(
173+
Consumer<ConnectionConfig.Builder> connectionConfigCustomizer) {
174+
Assert.notNull(connectionConfigCustomizer, "'connectionConfigCustomizer' must not be null");
175+
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
176+
this.connectionManagerCustomizer, this.socketConfigCustomizer,
177+
this.connectionConfigCustomizer.andThen(connectionConfigCustomizer),
155178
this.defaultRequestConfigCustomizer, this.tlsSocketStrategyFactory);
156179
}
157180

@@ -166,8 +189,8 @@ public HttpComponentsClientHttpRequestFactoryBuilder withTlsSocketStrategyFactor
166189
Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory) {
167190
Assert.notNull(tlsSocketStrategyFactory, "'tlsSocketStrategyFactory' must not be null");
168191
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
169-
this.connectionManagerCustomizer, this.socketConfigCustomizer, this.defaultRequestConfigCustomizer,
170-
tlsSocketStrategyFactory);
192+
this.connectionManagerCustomizer, this.socketConfigCustomizer, this.connectionConfigCustomizer,
193+
this.defaultRequestConfigCustomizer, tlsSocketStrategyFactory);
171194
}
172195

173196
/**
@@ -182,7 +205,7 @@ public HttpComponentsClientHttpRequestFactoryBuilder withDefaultRequestConfigCus
182205
Consumer<RequestConfig.Builder> defaultRequestConfigCustomizer) {
183206
Assert.notNull(defaultRequestConfigCustomizer, "'defaultRequestConfigCustomizer' must not be null");
184207
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
185-
this.connectionManagerCustomizer, this.socketConfigCustomizer,
208+
this.connectionManagerCustomizer, this.socketConfigCustomizer, this.connectionConfigCustomizer,
186209
this.defaultRequestConfigCustomizer.andThen(defaultRequestConfigCustomizer),
187210
this.tlsSocketStrategyFactory);
188211
}
@@ -191,10 +214,7 @@ public HttpComponentsClientHttpRequestFactoryBuilder withDefaultRequestConfigCus
191214
protected HttpComponentsClientHttpRequestFactory createClientHttpRequestFactory(
192215
ClientHttpRequestFactorySettings settings) {
193216
HttpClient httpClient = createHttpClient(settings);
194-
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
195-
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
196-
map.from(settings::connectTimeout).asInt(Duration::toMillis).to(factory::setConnectTimeout);
197-
return factory;
217+
return new HttpComponentsClientHttpRequestFactory(httpClient);
198218
}
199219

200220
private HttpClient createHttpClient(ClientHttpRequestFactorySettings settings) {
@@ -218,19 +238,29 @@ private PoolingHttpClientConnectionManager createConnectionManager(ClientHttpReq
218238
PoolingHttpClientConnectionManagerBuilder builder = PoolingHttpClientConnectionManagerBuilder.create()
219239
.useSystemProperties();
220240
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
221-
builder.setDefaultSocketConfig(createSocketConfig(settings));
241+
builder.setDefaultSocketConfig(createSocketConfig());
242+
builder.setDefaultConnectionConfig(createConnectionConfig(settings));
222243
map.from(settings::sslBundle).as(this.tlsSocketStrategyFactory).to(builder::setTlsSocketStrategy);
223244
this.connectionManagerCustomizer.accept(builder);
224245
return builder.build();
225246
}
226247

227-
private SocketConfig createSocketConfig(ClientHttpRequestFactorySettings settings) {
248+
private SocketConfig createSocketConfig() {
228249
SocketConfig.Builder builder = SocketConfig.custom();
250+
this.socketConfigCustomizer.accept(builder);
251+
return builder.build();
252+
}
253+
254+
private ConnectionConfig createConnectionConfig(ClientHttpRequestFactorySettings settings) {
255+
ConnectionConfig.Builder builder = ConnectionConfig.custom();
229256
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
257+
map.from(settings::connectTimeout)
258+
.as(Duration::toMillis)
259+
.to((timeout) -> builder.setConnectTimeout(timeout, TimeUnit.MILLISECONDS));
230260
map.from(settings::readTimeout)
231261
.asInt(Duration::toMillis)
232-
.to((timeout) -> builder.setSoTimeout(timeout, TimeUnit.MILLISECONDS));
233-
this.socketConfigCustomizer.accept(builder);
262+
.to((timeout) -> builder.setSocketTimeout(timeout, TimeUnit.MILLISECONDS));
263+
this.connectionConfigCustomizer.accept(builder);
234264
return builder.build();
235265
}
236266

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/http/client/HttpComponentsClientHttpRequestFactoryBuilderTests.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
import java.util.function.Function;
2222

2323
import org.apache.hc.client5.http.HttpRoute;
24-
import org.apache.hc.client5.http.classic.HttpClient;
24+
import org.apache.hc.client5.http.config.ConnectionConfig;
2525
import org.apache.hc.client5.http.config.RequestConfig;
26+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
2627
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
2728
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
2829
import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
@@ -94,18 +95,22 @@ void withTlsSocketStrategyFactory() {
9495

9596
@Override
9697
protected long connectTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
97-
return (long) ReflectionTestUtils.getField(requestFactory, "connectTimeout");
98+
return getConnectorConfig(requestFactory).getConnectTimeout().toMilliseconds();
9899
}
99100

100101
@Override
101-
@SuppressWarnings("unchecked")
102102
protected long readTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
103-
HttpClient httpClient = requestFactory.getHttpClient();
104-
Object connectionManager = ReflectionTestUtils.getField(httpClient, "connManager");
105-
SocketConfig socketConfig = ((Resolver<HttpRoute, SocketConfig>) ReflectionTestUtils.getField(connectionManager,
106-
"socketConfigResolver"))
107-
.resolve(null);
108-
return socketConfig.getSoTimeout().toMilliseconds();
103+
return getConnectorConfig(requestFactory).getSocketTimeout().toMilliseconds();
104+
}
105+
106+
@SuppressWarnings("unchecked")
107+
private ConnectionConfig getConnectorConfig(HttpComponentsClientHttpRequestFactory requestFactory) {
108+
CloseableHttpClient httpClient = (CloseableHttpClient) ReflectionTestUtils.getField(requestFactory,
109+
"httpClient");
110+
Object manager = ReflectionTestUtils.getField(httpClient, "connManager");
111+
ConnectionConfig connectorConfig = ((Resolver<HttpRoute, ConnectionConfig>) ReflectionTestUtils
112+
.getField(manager, "connectionConfigResolver")).resolve(null);
113+
return connectorConfig;
109114
}
110115

111116
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/ClientHttpRequestFactoriesHttpComponentsTests.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
package org.springframework.boot.web.client;
1818

1919
import org.apache.hc.client5.http.HttpRoute;
20-
import org.apache.hc.client5.http.classic.HttpClient;
20+
import org.apache.hc.client5.http.config.ConnectionConfig;
21+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
2122
import org.apache.hc.core5.function.Resolver;
22-
import org.apache.hc.core5.http.io.SocketConfig;
2323

2424
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
2525
import org.springframework.test.util.ReflectionTestUtils;
@@ -39,29 +39,33 @@ class ClientHttpRequestFactoriesHttpComponentsTests
3939
}
4040

4141
@Override
42-
protected long connectTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
43-
return (long) ReflectionTestUtils.getField(requestFactory, "connectTimeout");
42+
protected boolean supportsSettingConnectTimeout() {
43+
return true;
4444
}
4545

4646
@Override
47-
@SuppressWarnings("unchecked")
48-
protected long readTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
49-
HttpClient httpClient = requestFactory.getHttpClient();
50-
Object connectionManager = ReflectionTestUtils.getField(httpClient, "connManager");
51-
SocketConfig socketConfig = ((Resolver<HttpRoute, SocketConfig>) ReflectionTestUtils.getField(connectionManager,
52-
"socketConfigResolver"))
53-
.resolve(null);
54-
return socketConfig.getSoTimeout().toMilliseconds();
47+
protected boolean supportsSettingReadTimeout() {
48+
return true;
5549
}
5650

5751
@Override
58-
protected boolean supportsSettingConnectTimeout() {
59-
return true;
52+
protected long connectTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
53+
return getConnectorConfig(requestFactory).getConnectTimeout().toMilliseconds();
6054
}
6155

6256
@Override
63-
protected boolean supportsSettingReadTimeout() {
64-
return false;
57+
protected long readTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
58+
return getConnectorConfig(requestFactory).getSocketTimeout().toMilliseconds();
59+
}
60+
61+
@SuppressWarnings("unchecked")
62+
private ConnectionConfig getConnectorConfig(HttpComponentsClientHttpRequestFactory requestFactory) {
63+
CloseableHttpClient httpClient = (CloseableHttpClient) ReflectionTestUtils.getField(requestFactory,
64+
"httpClient");
65+
Object manager = ReflectionTestUtils.getField(httpClient, "connManager");
66+
ConnectionConfig connectorConfig = ((Resolver<HttpRoute, ConnectionConfig>) ReflectionTestUtils
67+
.getField(manager, "connectionConfigResolver")).resolve(null);
68+
return connectorConfig;
6569
}
6670

6771
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
import java.util.function.Function;
2626
import java.util.function.Supplier;
2727

28+
import org.apache.hc.client5.http.HttpRoute;
29+
import org.apache.hc.client5.http.config.ConnectionConfig;
30+
import org.apache.hc.core5.function.Resolver;
31+
import org.apache.hc.core5.util.Timeout;
32+
import org.assertj.core.extractor.Extractors;
2833
import org.junit.jupiter.api.Test;
2934
import org.junit.jupiter.api.extension.ExtendWith;
3035
import org.mockito.InOrder;
@@ -348,11 +353,18 @@ void defaultHeaderWhenUsingMockRestServiceServerAddsHeader() {
348353
}
349354

350355
@Test
356+
@SuppressWarnings("unchecked")
351357
void requestFactorySettingsAppliesSettings() {
352358
ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.defaults()
353-
.withConnectTimeout(Duration.ofSeconds(1));
359+
.withConnectTimeout(Duration.ofSeconds(1))
360+
.withReadTimeout(Duration.ofSeconds(2));
354361
RestTemplate template = this.builder.requestFactorySettings(settings).build();
355-
assertThat(template.getRequestFactory()).extracting("connectTimeout").isEqualTo(1000L);
362+
Resolver<HttpRoute, ConnectionConfig> resolver = (Resolver<HttpRoute, ConnectionConfig>) Extractors
363+
.byName("httpClient.connManager.connectionConfigResolver")
364+
.apply(template.getRequestFactory());
365+
ConnectionConfig config = resolver.resolve(mock());
366+
assertThat(config.getConnectTimeout()).isEqualTo(Timeout.of(Duration.ofSeconds(1)));
367+
assertThat(config.getSocketTimeout()).isEqualTo(Timeout.of(Duration.ofSeconds(2)));
356368
}
357369

358370
@Test

0 commit comments

Comments
 (0)