From 75b226c55a4fd62a146d9752eff40a3cfc823949 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Mon, 9 Dec 2024 16:07:38 +0800 Subject: [PATCH] Expose accessor method for underlying ClientHttpRequestFactorySettings After this commit, we can customize ClientHttpRequestFactorySettings base on underlying one --- .../boot/test/web/client/TestRestTemplate.java | 9 +++++++++ .../test/web/client/TestRestTemplateTests.java | 16 ++++++++++++---- .../boot/web/client/RestTemplateBuilder.java | 9 +++++++++ .../web/client/RestTemplateBuilderTests.java | 8 ++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java index 46c9067f8df3..4d725c462645 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java @@ -974,6 +974,15 @@ public TestRestTemplate withRequestFactorySettings(ClientHttpRequestFactorySetti this.restTemplate.getUriTemplateHandler()); } + /** + * Returns the underlying {@link ClientHttpRequestFactorySettings}. + * @return the underlying request factory settings + * @since 3.4.1 + */ + public ClientHttpRequestFactorySettings requestFactorySettings() { + return this.builder.requestFactorySettings(); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) private RequestEntity createRequestEntityWithRootAppliedUri(RequestEntity requestEntity) { return new RequestEntity(requestEntity.getBody(), requestEntity.getHeaders(), requestEntity.getMethod(), diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java index dc99a59174a3..8c4cf2b59caf 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java @@ -22,6 +22,7 @@ import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpClient.Redirect; +import java.time.Duration; import java.util.Base64; import java.util.stream.Stream; @@ -171,8 +172,8 @@ void httpComponentsAreBuildConsideringSettingsInRestTemplateBuilder() { void withSettingsUpdatesRedirectsForHttpComponents() { TestRestTemplate template = new TestRestTemplate(); assertThat(getRequestConfig(template).isRedirectsEnabled()).isFalse(); - assertThat(getRequestConfig(template - .withRequestFactorySettings(ClientHttpRequestFactorySettings.defaults().withRedirects(Redirects.FOLLOW))) + assertThat(getRequestConfig( + template.withRequestFactorySettings(template.requestFactorySettings().withRedirects(Redirects.FOLLOW))) .isRedirectsEnabled()).isTrue(); } @@ -181,11 +182,18 @@ void withSettingsUpdatesRedirectsForJdk() { TestRestTemplate template = new TestRestTemplate( new RestTemplateBuilder().requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk())); assertThat(getJdkHttpClient(template).followRedirects()).isEqualTo(Redirect.NORMAL); - assertThat(getJdkHttpClient(template.withRequestFactorySettings( - ClientHttpRequestFactorySettings.defaults().withRedirects(Redirects.DONT_FOLLOW))) + assertThat(getJdkHttpClient(template + .withRequestFactorySettings(template.requestFactorySettings().withRedirects(Redirects.DONT_FOLLOW))) .followRedirects()).isEqualTo(Redirect.NEVER); } + @Test + void getUnderlyingRequestFactorySettings() { + TestRestTemplate template = new TestRestTemplate(new RestTemplateBuilder().requestFactorySettings( + ClientHttpRequestFactorySettings.defaults().withConnectTimeout(Duration.ofSeconds(1)))); + assertThat(template.requestFactorySettings().connectTimeout()).isEqualTo(Duration.ofSeconds(1)); + } + private RequestConfig getRequestConfig(RestTemplateBuilder builder, HttpClientOption... httpClientOptions) { builder = (builder != null) ? builder : new RestTemplateBuilder(); TestRestTemplate template = new TestRestTemplate(builder, null, null, httpClientOptions); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java index d8f574b506ef..647a9486b662 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java @@ -435,6 +435,15 @@ this.errorHandler, this.basicAuthentication, append(this.defaultHeaders, name, v this.customizers, this.requestCustomizers); } + /** + * Gets the underlying {@link ClientHttpRequestFactorySettings}. + * @return the underlying request factory settings + * @since 3.4.1 + */ + public ClientHttpRequestFactorySettings requestFactorySettings() { + return this.requestFactorySettings; + } + /** * Sets the {@link ClientHttpRequestFactorySettings}. This will replace any previously * set {@link #connectTimeout(Duration) connectTimeout} ,{@link #readTimeout(Duration) diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java index c62b22b58b7d..81811a7aea33 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java @@ -355,6 +355,14 @@ void requestFactorySettingsAppliesSettings() { assertThat(template.getRequestFactory()).extracting("connectTimeout").isEqualTo(1000L); } + @Test + void requestFactorySettings() { + ClientHttpRequestFactorySettings connectTimeoutSettings = ClientHttpRequestFactorySettings.defaults() + .withConnectTimeout(Duration.ofSeconds(1)); + RestTemplateBuilder restTemplateBuilder = this.builder.requestFactorySettings(connectTimeoutSettings); + assertThat(restTemplateBuilder.requestFactorySettings().connectTimeout()).isEqualTo(Duration.ofSeconds(1)); + } + @Test void requestCustomizersAddsCustomizers() { RestTemplate template = this.builder