Sets the request factory directly.

This avoids the reflective factory which we don't need or want since we know it ahead of time.

Fixes gh-4423
This commit is contained in:
spencergibb
2025-03-14 15:10:52 -04:00
parent f454487a27
commit 229d7f3ba6
2 changed files with 33 additions and 1 deletions

View File

@@ -122,7 +122,11 @@ public class RestTemplateTransportClientFactory implements TransportClientFactor
RestTemplate restTemplate;
if (restTemplateBuilderSupplier != null && restTemplateBuilderSupplier.get() != null) {
restTemplate = restTemplateBuilderSupplier.get().requestFactory(() -> requestFactory).build();
// Avoid using RestTemplateBuilder.requestFactory(() -> requestFactory)
// when we have a concrete type, the reflective builder can throw errors if
// there is custom configuration (ie Redirects.DONT_FOLLOW) gh-4423
restTemplate = restTemplateBuilderSupplier.get().build();
restTemplate.setRequestFactory(requestFactory);
}
else {
restTemplate = new RestTemplate(requestFactory);

View File

@@ -16,12 +16,22 @@
package org.springframework.cloud.netflix.eureka.http;
import java.util.Optional;
import com.netflix.discovery.shared.resolver.DefaultEndpoint;
import com.netflix.discovery.shared.transport.EurekaHttpClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings.Redirects;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.InterceptingClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -58,6 +68,24 @@ class RestTemplateTransportClientFactoryTests {
assertThat(eurekaHttpClient).isInstanceOf(RestTemplateEurekaHttpClient.class);
}
@Test
void testRequestFactorySetWithRestTemplateBuilderSupplier() {
// Gateway Server WebMVC sets Redirects.DONT_FOLLOW, gh-4423
RestTemplateBuilder builder = new RestTemplateBuilder()
.requestFactorySettings(new ClientHttpRequestFactorySettings(Redirects.DONT_FOLLOW, null, null, null));
transportClientFactory = new RestTemplateTransportClientFactory(Optional.empty(), Optional.empty(),
new DefaultEurekaClientHttpRequestFactorySupplier(), () -> builder);
EurekaHttpClient eurekaHttpClient = transportClientFactory
.newClient(new DefaultEndpoint("http://localhost:8761"));
RestTemplateEurekaHttpClient restTemplateEurekaHttpClient = (RestTemplateEurekaHttpClient) eurekaHttpClient;
RestTemplate restTemplate = restTemplateEurekaHttpClient.getRestTemplate();
ClientHttpRequestFactory requestFactory = restTemplate.getRequestFactory();
if (requestFactory instanceof InterceptingClientHttpRequestFactory interceptingClientHttpRequestFactory) {
requestFactory = interceptingClientHttpRequestFactory.getDelegate();
}
assertThat(requestFactory).isInstanceOf(HttpComponentsClientHttpRequestFactory.class);
}
@AfterEach
void shutdown() {
transportClientFactory.shutdown();