Skip to content

Commit e72546d

Browse files
committed
Add customizer variant of requestFactorySettings
Add `requestFactorySettings` that accepts a `UnaryOperator` so that the existing `requestFactorySettings` can be customized rather than replaced. Closes gh-43258
1 parent 52992fb commit e72546d

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Map;
2626
import java.util.Set;
2727
import java.util.concurrent.TimeUnit;
28+
import java.util.function.UnaryOperator;
2829

2930
import javax.net.ssl.SSLContext;
3031

@@ -974,6 +975,22 @@ public TestRestTemplate withRequestFactorySettings(ClientHttpRequestFactorySetti
974975
this.restTemplate.getUriTemplateHandler());
975976
}
976977

978+
/**
979+
* Creates a new {@code TestRestTemplate} with the same configuration as this one,
980+
* except that it will customize the {@link ClientHttpRequestFactorySettings}. The
981+
* request factory used is a new instance of the underlying {@link RestTemplate}'s
982+
* request factory type (when possible).
983+
* @param requestFactorySettingsCustomizer a {@link UnaryOperator} to update the
984+
* settings
985+
* @return the new template
986+
* @since 3.4.1
987+
*/
988+
public TestRestTemplate withRequestFactorySettings(
989+
UnaryOperator<ClientHttpRequestFactorySettings> requestFactorySettingsCustomizer) {
990+
return new TestRestTemplate(this.builder.requestFactorySettings(requestFactorySettingsCustomizer),
991+
this.restTemplate.getUriTemplateHandler());
992+
}
993+
977994
@SuppressWarnings({ "rawtypes", "unchecked" })
978995
private RequestEntity<?> createRequestEntityWithRootAppliedUri(RequestEntity<?> requestEntity) {
979996
return new RequestEntity(requestEntity.getBody(), requestEntity.getHeaders(), requestEntity.getMethod(),

spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ void httpComponentsAreBuildConsideringSettingsInRestTemplateBuilder() {
168168
}
169169

170170
@Test
171-
void withSettingsUpdatesRedirectsForHttpComponents() {
171+
void withRequestFactorySettingsRedirectsForHttpComponents() {
172172
TestRestTemplate template = new TestRestTemplate();
173173
assertThat(getRequestConfig(template).isRedirectsEnabled()).isFalse();
174174
assertThat(getRequestConfig(template
@@ -177,7 +177,7 @@ void withSettingsUpdatesRedirectsForHttpComponents() {
177177
}
178178

179179
@Test
180-
void withSettingsUpdatesRedirectsForJdk() {
180+
void withRequestFactorySettingsRedirectsForJdk() {
181181
TestRestTemplate template = new TestRestTemplate(
182182
new RestTemplateBuilder().requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk()));
183183
assertThat(getJdkHttpClient(template).followRedirects()).isEqualTo(Redirect.NORMAL);
@@ -186,6 +186,16 @@ void withSettingsUpdatesRedirectsForJdk() {
186186
.followRedirects()).isEqualTo(Redirect.NEVER);
187187
}
188188

189+
@Test
190+
void withRequestFactorySettingsUpdateRedirectsForJdk() {
191+
TestRestTemplate template = new TestRestTemplate(
192+
new RestTemplateBuilder().requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk()));
193+
assertThat(getJdkHttpClient(template).followRedirects()).isEqualTo(Redirect.NORMAL);
194+
assertThat(getJdkHttpClient(
195+
template.withRequestFactorySettings((settings) -> settings.withRedirects(Redirects.DONT_FOLLOW)))
196+
.followRedirects()).isEqualTo(Redirect.NEVER);
197+
}
198+
189199
private RequestConfig getRequestConfig(RestTemplateBuilder builder, HttpClientOption... httpClientOptions) {
190200
builder = (builder != null) ? builder : new RestTemplateBuilder();
191201
TestRestTemplate template = new TestRestTemplate(builder, null, null, httpClientOptions);

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.Set;
3030
import java.util.function.Function;
3131
import java.util.function.Supplier;
32+
import java.util.function.UnaryOperator;
3233

3334
import org.springframework.beans.BeanUtils;
3435
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
@@ -451,6 +452,22 @@ public RestTemplateBuilder requestFactorySettings(ClientHttpRequestFactorySettin
451452
this.requestCustomizers);
452453
}
453454

455+
/**
456+
* Update the {@link ClientHttpRequestFactorySettings} using the given customizer.
457+
* @param requestFactorySettingsCustomizer a {@link UnaryOperator} to update request
458+
* factory settings
459+
* @return a new builder instance
460+
* @since 3.4.1
461+
*/
462+
public RestTemplateBuilder requestFactorySettings(
463+
UnaryOperator<ClientHttpRequestFactorySettings> requestFactorySettingsCustomizer) {
464+
Assert.notNull(requestFactorySettingsCustomizer, "ClientHttpRequestFactorySettingsCustomizer must not be null");
465+
return new RestTemplateBuilder(requestFactorySettingsCustomizer.apply(this.requestFactorySettings),
466+
this.detectRequestFactory, this.rootUri, this.messageConverters, this.interceptors,
467+
this.requestFactoryBuilder, this.uriTemplateHandler, this.errorHandler, this.basicAuthentication,
468+
this.defaultHeaders, this.customizers, this.requestCustomizers);
469+
}
470+
454471
/**
455472
* Sets the connection timeout on the underlying {@link ClientHttpRequestFactory}.
456473
* @param connectTimeout the connection timeout

0 commit comments

Comments
 (0)