Use customiserw while creating EurekaClientHttpRequestFactorySupplier beans. Add tests.

Signed-off-by: Olga Maciaszek-Sharma <olga.maciaszek-sharma@broadcom.com>
This commit is contained in:
Olga Maciaszek-Sharma
2025-01-08 20:33:25 +01:00
committed by Olga Maciaszek-Sharma
parent 8e3a33de29
commit f6c6720c5a
5 changed files with 49 additions and 11 deletions

View File

@@ -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<Set<EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer>> requestConfigCustomizers) {
return new DefaultEurekaClientHttpRequestFactorySupplier(restClientTimeoutProperties, requestConfigCustomizers);
}
@Bean

View File

@@ -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<Set<EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer>> requestConfigCustomizers) {
return new DefaultEurekaClientHttpRequestFactorySupplier(restClientTimeoutProperties, requestConfigCustomizers);
}
static class OnRestClientPresentAndEnabledCondition extends AllNestedConditions {

View File

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

View File

@@ -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();
}

View File

@@ -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<EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer> 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"));
}
}