Merge branch '4.0.x'

This commit is contained in:
spencergibb
2023-06-21 12:04:54 -04:00
3 changed files with 59 additions and 10 deletions

View File

@@ -8,7 +8,7 @@
|spring.cloud.config.fail-fast | `+++false+++` | Flag to indicate that failure to connect to the server is fatal (default false).
|spring.cloud.config.headers | | Additional headers used to create the client request.
|spring.cloud.config.initialize-on-context-refresh | `+++false+++` | Flag to initialize bootstrap configuration on context refresh event. Default false.
|spring.cloud.config.label | | The label name to use to pull remote configuration properties. The default is set on the server (generally "master" for a git based server).
|spring.cloud.config.label | | The label name to use to pull remote configuration properties. The default is set on the server (generally "main" for a git based server).
|spring.cloud.config.media-type | | The Accept header media type to send to config server.
|spring.cloud.config.multiple-uri-strategy | | The strategy to use when call to server fails and there are multiple URLs configured on the uri property (default {@link MultipleUriStrategy#ALWAYS}).
|spring.cloud.config.name | | Name of application used to fetch remote properties.

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);