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
This commit is contained in:
		
							parent
							
								
									52992fb510
								
							
						
					
					
						commit
						e72546d2a6
					
				|  | @ -25,6 +25,7 @@ import java.time.Duration; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
|  | import java.util.function.UnaryOperator; | ||||||
| 
 | 
 | ||||||
| import javax.net.ssl.SSLContext; | import javax.net.ssl.SSLContext; | ||||||
| 
 | 
 | ||||||
|  | @ -974,6 +975,22 @@ public class TestRestTemplate { | ||||||
| 				this.restTemplate.getUriTemplateHandler()); | 				this.restTemplate.getUriTemplateHandler()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Creates a new {@code TestRestTemplate} with the same configuration as this one, | ||||||
|  | 	 * except that it will customize the {@link ClientHttpRequestFactorySettings}. The | ||||||
|  | 	 * request factory used is a new instance of the underlying {@link RestTemplate}'s | ||||||
|  | 	 * request factory type (when possible). | ||||||
|  | 	 * @param requestFactorySettingsCustomizer a {@link UnaryOperator} to update the | ||||||
|  | 	 * settings | ||||||
|  | 	 * @return the new template | ||||||
|  | 	 * @since 3.4.1 | ||||||
|  | 	 */ | ||||||
|  | 	public TestRestTemplate withRequestFactorySettings( | ||||||
|  | 			UnaryOperator<ClientHttpRequestFactorySettings> requestFactorySettingsCustomizer) { | ||||||
|  | 		return new TestRestTemplate(this.builder.requestFactorySettings(requestFactorySettingsCustomizer), | ||||||
|  | 				this.restTemplate.getUriTemplateHandler()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	@SuppressWarnings({ "rawtypes", "unchecked" }) | 	@SuppressWarnings({ "rawtypes", "unchecked" }) | ||||||
| 	private RequestEntity<?> createRequestEntityWithRootAppliedUri(RequestEntity<?> requestEntity) { | 	private RequestEntity<?> createRequestEntityWithRootAppliedUri(RequestEntity<?> requestEntity) { | ||||||
| 		return new RequestEntity(requestEntity.getBody(), requestEntity.getHeaders(), requestEntity.getMethod(), | 		return new RequestEntity(requestEntity.getBody(), requestEntity.getHeaders(), requestEntity.getMethod(), | ||||||
|  |  | ||||||
|  | @ -168,7 +168,7 @@ class TestRestTemplateTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	void withSettingsUpdatesRedirectsForHttpComponents() { | 	void withRequestFactorySettingsRedirectsForHttpComponents() { | ||||||
| 		TestRestTemplate template = new TestRestTemplate(); | 		TestRestTemplate template = new TestRestTemplate(); | ||||||
| 		assertThat(getRequestConfig(template).isRedirectsEnabled()).isFalse(); | 		assertThat(getRequestConfig(template).isRedirectsEnabled()).isFalse(); | ||||||
| 		assertThat(getRequestConfig(template | 		assertThat(getRequestConfig(template | ||||||
|  | @ -177,7 +177,7 @@ class TestRestTemplateTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	void withSettingsUpdatesRedirectsForJdk() { | 	void withRequestFactorySettingsRedirectsForJdk() { | ||||||
| 		TestRestTemplate template = new TestRestTemplate( | 		TestRestTemplate template = new TestRestTemplate( | ||||||
| 				new RestTemplateBuilder().requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk())); | 				new RestTemplateBuilder().requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk())); | ||||||
| 		assertThat(getJdkHttpClient(template).followRedirects()).isEqualTo(Redirect.NORMAL); | 		assertThat(getJdkHttpClient(template).followRedirects()).isEqualTo(Redirect.NORMAL); | ||||||
|  | @ -186,6 +186,16 @@ class TestRestTemplateTests { | ||||||
| 			.followRedirects()).isEqualTo(Redirect.NEVER); | 			.followRedirects()).isEqualTo(Redirect.NEVER); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Test | ||||||
|  | 	void withRequestFactorySettingsUpdateRedirectsForJdk() { | ||||||
|  | 		TestRestTemplate template = new TestRestTemplate( | ||||||
|  | 				new RestTemplateBuilder().requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk())); | ||||||
|  | 		assertThat(getJdkHttpClient(template).followRedirects()).isEqualTo(Redirect.NORMAL); | ||||||
|  | 		assertThat(getJdkHttpClient( | ||||||
|  | 				template.withRequestFactorySettings((settings) -> settings.withRedirects(Redirects.DONT_FOLLOW))) | ||||||
|  | 			.followRedirects()).isEqualTo(Redirect.NEVER); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	private RequestConfig getRequestConfig(RestTemplateBuilder builder, HttpClientOption... httpClientOptions) { | 	private RequestConfig getRequestConfig(RestTemplateBuilder builder, HttpClientOption... httpClientOptions) { | ||||||
| 		builder = (builder != null) ? builder : new RestTemplateBuilder(); | 		builder = (builder != null) ? builder : new RestTemplateBuilder(); | ||||||
| 		TestRestTemplate template = new TestRestTemplate(builder, null, null, httpClientOptions); | 		TestRestTemplate template = new TestRestTemplate(builder, null, null, httpClientOptions); | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ import java.util.Map; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.function.Function; | import java.util.function.Function; | ||||||
| import java.util.function.Supplier; | import java.util.function.Supplier; | ||||||
|  | import java.util.function.UnaryOperator; | ||||||
| 
 | 
 | ||||||
| import org.springframework.beans.BeanUtils; | import org.springframework.beans.BeanUtils; | ||||||
| import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; | import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; | ||||||
|  | @ -451,6 +452,22 @@ public class RestTemplateBuilder { | ||||||
| 				this.requestCustomizers); | 				this.requestCustomizers); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update the {@link ClientHttpRequestFactorySettings} using the given customizer. | ||||||
|  | 	 * @param requestFactorySettingsCustomizer a {@link UnaryOperator} to update request | ||||||
|  | 	 * factory settings | ||||||
|  | 	 * @return a new builder instance | ||||||
|  | 	 * @since 3.4.1 | ||||||
|  | 	 */ | ||||||
|  | 	public RestTemplateBuilder requestFactorySettings( | ||||||
|  | 			UnaryOperator<ClientHttpRequestFactorySettings> requestFactorySettingsCustomizer) { | ||||||
|  | 		Assert.notNull(requestFactorySettingsCustomizer, "ClientHttpRequestFactorySettingsCustomizer must not be null"); | ||||||
|  | 		return new RestTemplateBuilder(requestFactorySettingsCustomizer.apply(this.requestFactorySettings), | ||||||
|  | 				this.detectRequestFactory, this.rootUri, this.messageConverters, this.interceptors, | ||||||
|  | 				this.requestFactoryBuilder, this.uriTemplateHandler, this.errorHandler, this.basicAuthentication, | ||||||
|  | 				this.defaultHeaders, this.customizers, this.requestCustomizers); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Sets the connection timeout on the underlying {@link ClientHttpRequestFactory}. | 	 * Sets the connection timeout on the underlying {@link ClientHttpRequestFactory}. | ||||||
| 	 * @param connectTimeout the connection timeout | 	 * @param connectTimeout the connection timeout | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue