Add possibility to customise HC5 RequestConfig.
Signed-off-by: Olga Maciaszek-Sharma <olga.maciaszek-sharma@broadcom.com>
This commit is contained in:
committed by
Olga Maciaszek-Sharma
parent
21cac3fa40
commit
8e3a33de29
@@ -16,11 +16,15 @@
|
|||||||
|
|
||||||
package org.springframework.cloud.netflix.eureka.http;
|
package org.springframework.cloud.netflix.eureka.http;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
|
import org.apache.hc.client5.http.config.ConnectionConfig;
|
||||||
import org.apache.hc.client5.http.config.RequestConfig;
|
import org.apache.hc.client5.http.config.RequestConfig;
|
||||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
||||||
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
|
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
|
||||||
@@ -31,6 +35,7 @@ import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
|
|||||||
import org.apache.hc.core5.http.io.SocketConfig;
|
import org.apache.hc.core5.http.io.SocketConfig;
|
||||||
import org.apache.hc.core5.util.Timeout;
|
import org.apache.hc.core5.util.Timeout;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.ObjectProvider;
|
||||||
import org.springframework.cloud.netflix.eureka.RestTemplateTimeoutProperties;
|
import org.springframework.cloud.netflix.eureka.RestTemplateTimeoutProperties;
|
||||||
import org.springframework.cloud.netflix.eureka.TimeoutProperties;
|
import org.springframework.cloud.netflix.eureka.TimeoutProperties;
|
||||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||||
@@ -49,10 +54,12 @@ import org.springframework.lang.Nullable;
|
|||||||
public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClientHttpRequestFactorySupplier {
|
public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClientHttpRequestFactorySupplier {
|
||||||
|
|
||||||
private final TimeoutProperties timeoutProperties;
|
private final TimeoutProperties timeoutProperties;
|
||||||
|
// TODO: switch to final after removing deprecated interfaces
|
||||||
|
private ObjectProvider<Set<RequestConfigCustomizer>> requestConfigCustomizers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated in favour of
|
* @deprecated in favour of
|
||||||
* {@link DefaultEurekaClientHttpRequestFactorySupplier#DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties)}
|
* {@link DefaultEurekaClientHttpRequestFactorySupplier#DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties, ObjectProvider)}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true)
|
||||||
public DefaultEurekaClientHttpRequestFactorySupplier() {
|
public DefaultEurekaClientHttpRequestFactorySupplier() {
|
||||||
@@ -61,17 +68,28 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated in favour of
|
* @deprecated in favour of
|
||||||
* {@link DefaultEurekaClientHttpRequestFactorySupplier#DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties)}
|
* {@link DefaultEurekaClientHttpRequestFactorySupplier#DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties, ObjectProvider)}
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true)
|
||||||
public DefaultEurekaClientHttpRequestFactorySupplier(RestTemplateTimeoutProperties timeoutProperties) {
|
public DefaultEurekaClientHttpRequestFactorySupplier(RestTemplateTimeoutProperties timeoutProperties) {
|
||||||
this.timeoutProperties = timeoutProperties;
|
this.timeoutProperties = timeoutProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in favour of
|
||||||
|
* {@link DefaultEurekaClientHttpRequestFactorySupplier#DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties, ObjectProvider)}
|
||||||
|
*/
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties timeoutProperties) {
|
public DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties timeoutProperties) {
|
||||||
this.timeoutProperties = timeoutProperties;
|
this.timeoutProperties = timeoutProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties timeoutProperties,
|
||||||
|
ObjectProvider<Set<RequestConfigCustomizer>> requestConfigCustomizers) {
|
||||||
|
this.timeoutProperties = timeoutProperties;
|
||||||
|
this.requestConfigCustomizers = requestConfigCustomizers;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ClientHttpRequestFactory get(SSLContext sslContext, @Nullable HostnameVerifier hostnameVerifier) {
|
public ClientHttpRequestFactory get(SSLContext sslContext, @Nullable HostnameVerifier hostnameVerifier) {
|
||||||
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
|
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
|
||||||
@@ -79,9 +97,7 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie
|
|||||||
httpClientBuilder
|
httpClientBuilder
|
||||||
.setConnectionManager(buildConnectionManager(sslContext, hostnameVerifier, timeoutProperties));
|
.setConnectionManager(buildConnectionManager(sslContext, hostnameVerifier, timeoutProperties));
|
||||||
}
|
}
|
||||||
if (timeoutProperties != null) {
|
httpClientBuilder.setDefaultRequestConfig(buildRequestConfig());
|
||||||
httpClientBuilder.setDefaultRequestConfig(buildRequestConfig());
|
|
||||||
}
|
|
||||||
|
|
||||||
CloseableHttpClient httpClient = httpClientBuilder.build();
|
CloseableHttpClient httpClient = httpClientBuilder.build();
|
||||||
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
|
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
|
||||||
@@ -90,7 +106,7 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie
|
|||||||
}
|
}
|
||||||
|
|
||||||
private HttpClientConnectionManager buildConnectionManager(SSLContext sslContext, HostnameVerifier hostnameVerifier,
|
private HttpClientConnectionManager buildConnectionManager(SSLContext sslContext, HostnameVerifier hostnameVerifier,
|
||||||
TimeoutProperties restTemplateTimeoutProperties) {
|
TimeoutProperties timeoutProperties) {
|
||||||
PoolingHttpClientConnectionManagerBuilder connectionManagerBuilder = PoolingHttpClientConnectionManagerBuilder
|
PoolingHttpClientConnectionManagerBuilder connectionManagerBuilder = PoolingHttpClientConnectionManagerBuilder
|
||||||
.create();
|
.create();
|
||||||
SSLConnectionSocketFactoryBuilder sslConnectionSocketFactoryBuilder = SSLConnectionSocketFactoryBuilder
|
SSLConnectionSocketFactoryBuilder sslConnectionSocketFactoryBuilder = SSLConnectionSocketFactoryBuilder
|
||||||
@@ -102,20 +118,30 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie
|
|||||||
sslConnectionSocketFactoryBuilder.setHostnameVerifier(hostnameVerifier);
|
sslConnectionSocketFactoryBuilder.setHostnameVerifier(hostnameVerifier);
|
||||||
}
|
}
|
||||||
connectionManagerBuilder.setSSLSocketFactory(sslConnectionSocketFactoryBuilder.build());
|
connectionManagerBuilder.setSSLSocketFactory(sslConnectionSocketFactoryBuilder.build());
|
||||||
if (restTemplateTimeoutProperties != null) {
|
if (timeoutProperties != null) {
|
||||||
connectionManagerBuilder.setDefaultSocketConfig(SocketConfig.custom()
|
connectionManagerBuilder.setDefaultSocketConfig(SocketConfig.custom()
|
||||||
.setSoTimeout(Timeout.of(restTemplateTimeoutProperties.getSocketTimeout(), TimeUnit.MILLISECONDS))
|
.setSoTimeout(Timeout.of(timeoutProperties.getSocketTimeout(), TimeUnit.MILLISECONDS))
|
||||||
.build());
|
.build());
|
||||||
|
connectionManagerBuilder.setDefaultConnectionConfig(ConnectionConfig.custom().
|
||||||
|
setConnectTimeout(Timeout.of(timeoutProperties.getConnectTimeout(),
|
||||||
|
TimeUnit.MILLISECONDS)).build()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return connectionManagerBuilder.build();
|
return connectionManagerBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private RequestConfig buildRequestConfig() {
|
private RequestConfig buildRequestConfig() {
|
||||||
return RequestConfig.custom()
|
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
|
||||||
.setConnectTimeout(Timeout.of(timeoutProperties.getConnectTimeout(), TimeUnit.MILLISECONDS))
|
if (timeoutProperties != null) {
|
||||||
.setConnectionRequestTimeout(
|
requestConfigBuilder.setConnectionRequestTimeout(
|
||||||
Timeout.of(timeoutProperties.getConnectRequestTimeout(), TimeUnit.MILLISECONDS))
|
Timeout.of(timeoutProperties.getConnectRequestTimeout(), TimeUnit.MILLISECONDS));
|
||||||
.build();
|
}
|
||||||
|
Optional.ofNullable(requestConfigCustomizers).ifPresent(
|
||||||
|
requestConfigCustomizers ->
|
||||||
|
requestConfigCustomizers
|
||||||
|
.getIfAvailable(Collections::emptySet)
|
||||||
|
.forEach(customizer -> customizer.customize(requestConfigBuilder)));
|
||||||
|
return requestConfigBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ package org.springframework.cloud.netflix.eureka.http;
|
|||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
|
import org.apache.hc.client5.http.config.RequestConfig;
|
||||||
|
|
||||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
@@ -38,4 +40,10 @@ public interface EurekaClientHttpRequestFactorySupplier {
|
|||||||
*/
|
*/
|
||||||
ClientHttpRequestFactory get(SSLContext sslContext, @Nullable HostnameVerifier hostnameVerifier);
|
ClientHttpRequestFactory get(SSLContext sslContext, @Nullable HostnameVerifier hostnameVerifier);
|
||||||
|
|
||||||
|
interface RequestConfigCustomizer {
|
||||||
|
|
||||||
|
void customize(RequestConfig.Builder builder);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user