From 57e2ff59183b54559cdbcedf91c79ba1c9b920dc Mon Sep 17 00:00:00 2001 From: buildmaster Date: Sat, 17 Jun 2023 13:46:03 +0000 Subject: [PATCH 1/2] Bumping versions --- docs/src/main/asciidoc/_configprops.adoc | 2 +- .../cloud/config/client/ConfigServerConfigDataLoader.java | 3 ++- .../cloud/config/server/support/HttpClient4SupportTest.java | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/src/main/asciidoc/_configprops.adoc b/docs/src/main/asciidoc/_configprops.adoc index c19776c0..5d4e8059 100644 --- a/docs/src/main/asciidoc/_configprops.adoc +++ b/docs/src/main/asciidoc/_configprops.adoc @@ -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. diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java index c2703428..ced0f6ef 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java @@ -166,7 +166,8 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader Date: Wed, 21 Jun 2023 12:03:47 -0400 Subject: [PATCH 2/2] Updates to handle deprecated/removed setReadTimeout() method --- .../client/tls/ConfigClientTlsTests.java | 33 ++++++++++++++++++ .../ConfigClientRequestTemplateFactory.java | 34 ++++++++++++++----- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java index c9213c6f..3dde00b6 100644 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java +++ b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java @@ -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()); + } + + } + } diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java index 979b4e54..44f7c8ef 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java @@ -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);