From f6c6720c5ac38e5ea186ee2ddac55bcc053f97f4 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Wed, 8 Jan 2025 20:33:25 +0100 Subject: [PATCH] Use customiserw while creating EurekaClientHttpRequestFactorySupplier beans. Add tests. Signed-off-by: Olga Maciaszek-Sharma --- ...coveryClientOptionalArgsConfiguration.java | 6 ++-- ...ekaConfigServerBootstrapConfiguration.java | 7 ++-- .../EurekaConfigServerBootstrapper.java | 2 +- .../http/EurekaServerMockApplication.java | 10 +++++- .../http/RestClientEurekaHttpClientTests.java | 35 ++++++++++++++++--- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java index a80c38e73..355f7888e 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.cloud.netflix.eureka.config; import java.io.IOException; import java.security.GeneralSecurityException; +import java.util.Set; import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; @@ -189,8 +190,9 @@ public class DiscoveryClientOptionalArgsConfiguration { @Bean @ConditionalOnMissingBean EurekaClientHttpRequestFactorySupplier defaultEurekaClientHttpRequestFactorySupplier( - RestClientTimeoutProperties restClientTimeoutProperties) { - return new DefaultEurekaClientHttpRequestFactorySupplier(restClientTimeoutProperties); + RestClientTimeoutProperties restClientTimeoutProperties, + ObjectProvider> requestConfigCustomizers) { + return new DefaultEurekaClientHttpRequestFactorySupplier(restClientTimeoutProperties, requestConfigCustomizers); } @Bean diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java index 8d4780633..8983580a1 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.cloud.netflix.eureka.config; +import java.util.Set; + import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.shared.transport.EurekaHttpClient; @@ -174,8 +176,9 @@ public class EurekaConfigServerBootstrapConfiguration { @Bean @ConditionalOnMissingBean EurekaClientHttpRequestFactorySupplier defaultEurekaClientHttpRequestFactorySupplier( - RestClientTimeoutProperties restClientTimeoutProperties) { - return new DefaultEurekaClientHttpRequestFactorySupplier(restClientTimeoutProperties); + RestClientTimeoutProperties restClientTimeoutProperties, + ObjectProvider> requestConfigCustomizers) { + return new DefaultEurekaClientHttpRequestFactorySupplier(restClientTimeoutProperties, requestConfigCustomizers); } static class OnRestClientPresentAndEnabledCondition extends AllNestedConditions { diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapper.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapper.java index 7892754ca..0c2baf860 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapper.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapper.java @@ -61,7 +61,7 @@ public class EurekaConfigServerBootstrapper implements BootstrapRegistryInitiali EurekaHttpClient httpClient = new RestClientTransportClientFactory( context.getOrElse(TlsProperties.class, null), context.getOrElse(EurekaClientHttpRequestFactorySupplier.class, - new DefaultEurekaClientHttpRequestFactorySupplier(new RestClientTimeoutProperties()))) + new DefaultEurekaClientHttpRequestFactorySupplier(new RestClientTimeoutProperties(), null))) .newClient(HostnameBasedUrlRandomizer.randomEndpoint(config, getPropertyResolver(context))); return new EurekaConfigServerInstanceProvider(httpClient, config)::getInstances; }); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java index 69568aeef..9e5018659 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java @@ -25,12 +25,14 @@ import com.netflix.appinfo.LeaseInfo; import com.netflix.appinfo.MyDataCenterInfo; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.Applications; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; @@ -45,6 +47,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; @@ -172,7 +175,12 @@ public class EurekaServerMockApplication { } @GetMapping("/apps/{appName}") - public Application getApplication(@PathVariable String appName) { + public Application getApplication(@PathVariable String appName, + @RequestHeader HttpHeaders headers) { + // Used to verify that RequestConfig customizer has taken effect + if (!headers.containsKey("upgrade")) { + throw new RuntimeException("No upgrade header found"); + } return new Application(); } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestClientEurekaHttpClientTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestClientEurekaHttpClientTests.java index a9fafc0cc..e2880a711 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestClientEurekaHttpClientTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestClientEurekaHttpClientTests.java @@ -16,22 +16,29 @@ package org.springframework.cloud.netflix.eureka.http; +import java.util.Collections; import java.util.Optional; +import java.util.Set; import com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider; import com.netflix.discovery.shared.resolver.DefaultEndpoint; +import com.netflix.discovery.shared.transport.EurekaHttpClient; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.cloud.loadbalancer.support.SimpleObjectProvider; import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; import org.springframework.cloud.netflix.eureka.RestClientTimeoutProperties; import org.springframework.test.annotation.DirtiesContext; import org.springframework.web.client.RestClient; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; + /** * Tests for {@link RestClientEurekaHttpClient}. * @@ -53,13 +60,9 @@ class RestClientEurekaHttpClientTests extends AbstractEurekaHttpClientTests { @BeforeEach void setup() { - eurekaHttpClient = new RestClientTransportClientFactory(Optional.empty(), Optional.empty(), - new DefaultEurekaClientHttpRequestFactorySupplier(new RestClientTimeoutProperties()), - RestClient::builder) - .newClient(new DefaultEndpoint(serviceUrl)); + eurekaHttpClient = buildEurekaHttpClient(); EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils); - String appname = "customapp"; config.setIpAddress("127.0.0.1"); config.setHostname("localhost"); @@ -73,4 +76,26 @@ class RestClientEurekaHttpClientTests extends AbstractEurekaHttpClientTests { info = new EurekaConfigBasedInstanceInfoProvider(config).get(); } + private EurekaHttpClient buildEurekaHttpClient() { + return buildEurekaHttpClient(Collections.emptySet()); + } + + private EurekaHttpClient buildEurekaHttpClient(Set customizers) { + return new RestClientTransportClientFactory(Optional.empty(), Optional.empty(), + new DefaultEurekaClientHttpRequestFactorySupplier(new RestClientTimeoutProperties(), + new SimpleObjectProvider<>(customizers)), + RestClient::builder) + .newClient(new DefaultEndpoint(serviceUrl)); + } + + @Test + void shouldCustomiseHttpClientRequestConfig() { + eurekaHttpClient = buildEurekaHttpClient(Set.of(builder -> + builder.setProtocolUpgradeEnabled(false))); + assertThatExceptionOfType(RuntimeException.class) + .isThrownBy(() -> eurekaHttpClient.getApplication("test")); + } + + + }