This commit is contained in:
Ryan Baxter
2023-06-27 19:40:51 -04:00
2 changed files with 58 additions and 9 deletions

View File

@@ -18,6 +18,8 @@ package org.springframework.cloud.config.client.tls;
import java.io.File;
import org.apache.commons.logging.LogFactory;
import org.apache.hc.core5.http.io.SocketConfig;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -25,6 +27,8 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.config.client.ConfigClientProperties;
import org.springframework.cloud.config.client.ConfigClientRequestTemplateFactory;
import org.springframework.cloud.config.server.EnableConfigServer;
import static org.assertj.core.api.Assertions.assertThat;
@@ -68,6 +72,23 @@ public class ConfigClientTlsTests extends AbstractTlsSetup {
}
}
@Test
@SuppressWarnings({ "unchecked" })
public void tlsSetsRequestReadTimeout() {
try (TlsConfigClientRunner client = createConfigClient()) {
enableTlsClient(client);
client.property("logging.level.org.springframework.boot.context.config", "TRACE");
client.property("logging.level.org.springframework.cloud.config.client", "DEBUG");
int timeoutMillis = (60 * 1000 * 3) + 5001;
client.property("spring.cloud.config.request-read-timeout", String.valueOf(timeoutMillis));
client.start();
ConfigClientProperties configClientProperties = client.app().getBean(ConfigClientProperties.class);
TestFactory factory = new TestFactory(configClientProperties);
SocketConfig.Builder socketBuilder = factory.getSocketBuilderForTls();
assertThat(socketBuilder.build().getSoTimeout().toMilliseconds()).isEqualTo(timeoutMillis);
}
}
@Test
public void tlsClientCanBeDisabled() {
try (TlsConfigClientRunner client = createConfigClient()) {
@@ -158,4 +179,16 @@ public class ConfigClientTlsTests extends AbstractTlsSetup {
}
static class TestFactory extends ConfigClientRequestTemplateFactory {
TestFactory(ConfigClientProperties properties) {
super(LogFactory.getLog(TestFactory.class), properties);
}
public SocketConfig.Builder getSocketBuilderForTls() {
return createSocketBuilderForTls(getProperties());
}
}
}

View File

@@ -21,6 +21,7 @@ import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
@@ -30,6 +31,8 @@ import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.util.Timeout;
import org.springframework.cloud.configuration.SSLContextFactory;
import org.springframework.http.HttpHeaders;
@@ -83,20 +86,13 @@ public class ConfigClientRequestTemplateFactory {
return template;
}
private ClientHttpRequestFactory createHttpRequestFactory(ConfigClientProperties client) {
protected ClientHttpRequestFactory createHttpRequestFactory(ConfigClientProperties client) {
if (client.getTls().isEnabled()) {
try {
SSLContextFactory factory = new SSLContextFactory(client.getTls());
SSLContext sslContext = factory.createSSLContext();
SSLConnectionSocketFactoryBuilder sslConnectionSocketFactoryBuilder = SSLConnectionSocketFactoryBuilder
.create();
sslConnectionSocketFactoryBuilder.setSslContext(sslContext);
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder
.create().setSSLSocketFactory(sslConnectionSocketFactoryBuilder.build()).build();
PoolingHttpClientConnectionManager connectionManager = createConnectionManagerForTls(client);
HttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();
HttpComponentsClientHttpRequestFactory result = new HttpComponentsClientHttpRequestFactory(httpClient);
result.setReadTimeout(client.getRequestReadTimeout());
result.setConnectTimeout(client.getRequestConnectTimeout());
return result;
@@ -113,6 +109,26 @@ public class ConfigClientRequestTemplateFactory {
return result;
}
protected PoolingHttpClientConnectionManager createConnectionManagerForTls(ConfigClientProperties client)
throws GeneralSecurityException, IOException {
SSLContextFactory factory = new SSLContextFactory(client.getTls());
SSLContext sslContext = factory.createSSLContext();
SSLConnectionSocketFactoryBuilder sslConnectionSocketFactoryBuilder = SSLConnectionSocketFactoryBuilder
.create();
sslConnectionSocketFactoryBuilder.setSslContext(sslContext);
SocketConfig.Builder socketBuilder = createSocketBuilderForTls(client);
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultSocketConfig(socketBuilder.build())
.setSSLSocketFactory(sslConnectionSocketFactoryBuilder.build()).build();
return connectionManager;
}
protected SocketConfig.Builder createSocketBuilderForTls(ConfigClientProperties client) {
SocketConfig.Builder socketBuilder = SocketConfig.custom()
.setSoTimeout(Timeout.of(client.getRequestReadTimeout(), TimeUnit.MILLISECONDS));
return socketBuilder;
}
public void addAuthorizationToken(HttpHeaders httpHeaders, String username, String password) {
String authorization = properties.getHeaders().get(AUTHORIZATION);