Merge pull request #43258 from quaff
* pr/43258: Polish 'Add `redirects(...)` method to `RestTemplateBuilder`' Add `redirects(...)` method to `RestTemplateBuilder` Closes gh-43258
This commit is contained in:
commit
b7f3627b7e
|
|
@ -47,6 +47,7 @@ import org.apache.hc.core5.ssl.SSLContextBuilder;
|
|||
import org.apache.hc.core5.ssl.TrustStrategy;
|
||||
|
||||
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.boot.web.client.RootUriTemplateHandler;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
|
|
@ -92,6 +93,7 @@ import org.springframework.web.util.UriTemplateHandler;
|
|||
* @author Andy Wilkinson
|
||||
* @author Kristine Jetzke
|
||||
* @author Dmytro Nosan
|
||||
* @author Yanming Zhou
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class TestRestTemplate {
|
||||
|
|
@ -1032,7 +1034,8 @@ public class TestRestTemplate {
|
|||
Set<HttpClientOption> options = new HashSet<>(Arrays.asList(httpClientOptions));
|
||||
this.cookieSpec = (options.contains(HttpClientOption.ENABLE_COOKIES) ? StandardCookieSpec.STRICT
|
||||
: StandardCookieSpec.IGNORE);
|
||||
this.enableRedirects = options.contains(HttpClientOption.ENABLE_REDIRECTS);
|
||||
this.enableRedirects = options.contains(HttpClientOption.ENABLE_REDIRECTS)
|
||||
|| settings.redirects() != Redirects.DONT_FOLLOW;
|
||||
boolean ssl = options.contains(HttpClientOption.SSL);
|
||||
if (settings.readTimeout() != null || ssl) {
|
||||
setHttpClient(createHttpClient(settings.readTimeout(), ssl));
|
||||
|
|
|
|||
|
|
@ -20,12 +20,16 @@ import java.io.IOException;
|
|||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.net.URI;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpClient.Redirect;
|
||||
import java.util.Base64;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings.Redirects;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate.CustomHttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate.HttpClientOption;
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
|
|
@ -38,6 +42,7 @@ import org.springframework.http.RequestEntity;
|
|||
import org.springframework.http.client.ClientHttpRequest;
|
||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.http.client.JdkClientHttpRequestFactory;
|
||||
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||
import org.springframework.mock.env.MockEnvironment;
|
||||
import org.springframework.mock.http.client.MockClientHttpRequest;
|
||||
|
|
@ -66,6 +71,7 @@ import static org.mockito.Mockito.mock;
|
|||
* @author Stephane Nicoll
|
||||
* @author Andy Wilkinson
|
||||
* @author Kristine Jetzke
|
||||
* @author Yanming Zhou
|
||||
*/
|
||||
class TestRestTemplateTests {
|
||||
|
||||
|
|
@ -131,12 +137,53 @@ class TestRestTemplateTests {
|
|||
|
||||
@Test
|
||||
void options() {
|
||||
TestRestTemplate template = new TestRestTemplate(HttpClientOption.ENABLE_REDIRECTS);
|
||||
RequestConfig config = getRequestConfig(
|
||||
new TestRestTemplate(HttpClientOption.ENABLE_REDIRECTS, HttpClientOption.ENABLE_COOKIES));
|
||||
assertThat(config.isRedirectsEnabled()).isTrue();
|
||||
assertThat(config.getCookieSpec()).isEqualTo("strict");
|
||||
}
|
||||
|
||||
@Test
|
||||
void jdkBuilderCanBeSpecifiedWithSpecificRedirects() {
|
||||
RestTemplateBuilder builder = new RestTemplateBuilder()
|
||||
.requestFactoryBuilder(ClientHttpRequestFactoryBuilder.jdk());
|
||||
TestRestTemplate templateWithRedirects = new TestRestTemplate(builder.redirects(Redirects.FOLLOW));
|
||||
assertThat(getJdkHttpClient(templateWithRedirects).followRedirects()).isEqualTo(Redirect.NORMAL);
|
||||
TestRestTemplate templateWithoutRedirects = new TestRestTemplate(builder.redirects(Redirects.DONT_FOLLOW));
|
||||
assertThat(getJdkHttpClient(templateWithoutRedirects).followRedirects()).isEqualTo(Redirect.NEVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
void httpComponentsAreBuildConsideringSettingsInRestTemplateBuilder() {
|
||||
RestTemplateBuilder builder = new RestTemplateBuilder()
|
||||
.requestFactoryBuilder(ClientHttpRequestFactoryBuilder.httpComponents());
|
||||
assertThat(getRequestConfig((RestTemplateBuilder) null).isRedirectsEnabled()).isTrue();
|
||||
assertThat(getRequestConfig(null, HttpClientOption.ENABLE_REDIRECTS).isRedirectsEnabled()).isTrue();
|
||||
assertThat(getRequestConfig(builder).isRedirectsEnabled()).isTrue();
|
||||
assertThat(getRequestConfig(builder, HttpClientOption.ENABLE_REDIRECTS).isRedirectsEnabled()).isTrue();
|
||||
assertThat(getRequestConfig(builder.redirects(Redirects.DONT_FOLLOW)).isRedirectsEnabled()).isFalse();
|
||||
assertThat(getRequestConfig(builder.redirects(Redirects.DONT_FOLLOW), HttpClientOption.ENABLE_REDIRECTS)
|
||||
.isRedirectsEnabled()).isTrue();
|
||||
}
|
||||
|
||||
private RequestConfig getRequestConfig(RestTemplateBuilder builder, HttpClientOption... httpClientOptions) {
|
||||
builder = (builder != null) ? builder : new RestTemplateBuilder();
|
||||
TestRestTemplate template = new TestRestTemplate(builder, null, null, httpClientOptions);
|
||||
return getRequestConfig(template);
|
||||
}
|
||||
|
||||
private RequestConfig getRequestConfig(TestRestTemplate template) {
|
||||
CustomHttpComponentsClientHttpRequestFactory factory = (CustomHttpComponentsClientHttpRequestFactory) template
|
||||
.getRestTemplate()
|
||||
.getRequestFactory();
|
||||
RequestConfig config = factory.createRequestConfig();
|
||||
assertThat(config.isRedirectsEnabled()).isTrue();
|
||||
return factory.createRequestConfig();
|
||||
}
|
||||
|
||||
private HttpClient getJdkHttpClient(TestRestTemplate templateWithRedirects) {
|
||||
JdkClientHttpRequestFactory requestFactory = (JdkClientHttpRequestFactory) templateWithRedirects
|
||||
.getRestTemplate()
|
||||
.getRequestFactory();
|
||||
return (HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import java.util.function.Supplier;
|
|||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings.Redirects;
|
||||
import org.springframework.boot.ssl.SslBundle;
|
||||
import org.springframework.http.client.ClientHttpRequest;
|
||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||
|
|
@ -64,6 +65,7 @@ import org.springframework.web.util.UriTemplateHandler;
|
|||
* @author Kevin Strijbos
|
||||
* @author Ilya Lukyanovich
|
||||
* @author Scott Frederick
|
||||
* @author Yanming Zhou
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class RestTemplateBuilder {
|
||||
|
|
@ -501,6 +503,19 @@ public class RestTemplateBuilder {
|
|||
this.defaultHeaders, this.customizers, this.requestCustomizers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the redirect strategy on the underlying {@link ClientHttpRequestFactory}.
|
||||
* @param redirects the redirect strategy
|
||||
* @return a new builder instance.
|
||||
* @since 3.4.1
|
||||
*/
|
||||
public RestTemplateBuilder redirects(Redirects redirects) {
|
||||
return new RestTemplateBuilder(this.requestFactorySettings.withRedirects(redirects), this.detectRequestFactory,
|
||||
this.rootUri, this.messageConverters, this.interceptors, this.requestFactoryBuilder,
|
||||
this.uriTemplateHandler, this.errorHandler, this.basicAuthentication, this.defaultHeaders,
|
||||
this.customizers, this.requestCustomizers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the SSL bundle on the underlying {@link ClientHttpRequestFactory}.
|
||||
* @param sslBundle the SSL bundle
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import org.mockito.Mock;
|
|||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
|
||||
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings.Redirects;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
|
|
@ -73,6 +74,7 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat
|
|||
* @author Kevin Strijbos
|
||||
* @author Ilya Lukyanovich
|
||||
* @author Brian Clozel
|
||||
* @author Yanming Zhou
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class RestTemplateBuilderTests {
|
||||
|
|
@ -486,6 +488,13 @@ class RestTemplateBuilderTests {
|
|||
assertThat(template.getRequestFactory()).isInstanceOf(BufferingClientHttpRequestFactory.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void configureRedirects() {
|
||||
assertThat(this.builder.redirects(Redirects.DONT_FOLLOW)).extracting("requestFactorySettings")
|
||||
.extracting("redirects")
|
||||
.isSameAs(Redirects.DONT_FOLLOW);
|
||||
}
|
||||
|
||||
private ClientHttpRequest createRequest(RestTemplate template) {
|
||||
return ReflectionTestUtils.invokeMethod(template, "createRequest", URI.create("http://localhost"),
|
||||
HttpMethod.GET);
|
||||
|
|
|
|||
Loading…
Reference in New Issue