Commit 556ce14f authored by Phillip Webb's avatar Phillip Webb

Fix TestRestTemplate.withBasicAuth interceptors

Update `TestRestTemplate` to handle `BasicAuthorizationInterceptor`s
correctly. Prior to this commit the `BasicAuthorizationInterceptor`
was added directly to the `ClientHttpRequestFactory` rather than
to the `RestTemplate`. This meant that it could not easily be removed
when `TestRestTemplate.withBasicAuth` was invoked.

The `TestRestTemplate` now sets the interceptor on `RestTemplate`
directly and relies on the logic in `InterceptingHttpAccessor` to
add it to the `ClientHttpRequestFactory`.

Fixes gh-7812
parent 9ccf4739
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -48,7 +48,6 @@ import org.springframework.http.ResponseEntity; ...@@ -48,7 +48,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.InterceptingClientHttpRequestFactory;
import org.springframework.http.client.support.BasicAuthorizationInterceptor; import org.springframework.http.client.support.BasicAuthorizationInterceptor;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
...@@ -144,11 +143,19 @@ public class TestRestTemplate { ...@@ -144,11 +143,19 @@ public class TestRestTemplate {
if (username == null) { if (username == null) {
return; return;
} }
List<ClientHttpRequestInterceptor> interceptors = Collections List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
.<ClientHttpRequestInterceptor>singletonList( if (interceptors == null) {
new BasicAuthorizationInterceptor(username, password)); interceptors = Collections.emptyList();
restTemplate.setRequestFactory(new InterceptingClientHttpRequestFactory( }
restTemplate.getRequestFactory(), interceptors)); interceptors = new ArrayList<ClientHttpRequestInterceptor>(interceptors);
Iterator<ClientHttpRequestInterceptor> iterator = interceptors.iterator();
while (iterator.hasNext()) {
if (iterator.next() instanceof BasicAuthorizationInterceptor) {
iterator.remove();
}
}
interceptors.add(new BasicAuthorizationInterceptor(username, password));
restTemplate.setInterceptors(interceptors);
} }
/** /**
...@@ -985,8 +992,7 @@ public class TestRestTemplate { ...@@ -985,8 +992,7 @@ public class TestRestTemplate {
public TestRestTemplate withBasicAuth(String username, String password) { public TestRestTemplate withBasicAuth(String username, String password) {
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(getRestTemplate().getMessageConverters()); restTemplate.setMessageConverters(getRestTemplate().getMessageConverters());
restTemplate.setInterceptors( restTemplate.setInterceptors(getRestTemplate().getInterceptors());
removeBasicAuthInterceptorIfPresent(getRestTemplate().getInterceptors()));
restTemplate.setRequestFactory(getRestTemplate().getRequestFactory()); restTemplate.setRequestFactory(getRestTemplate().getRequestFactory());
restTemplate.setUriTemplateHandler(getRestTemplate().getUriTemplateHandler()); restTemplate.setUriTemplateHandler(getRestTemplate().getUriTemplateHandler());
TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate, username, TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate, username,
...@@ -996,19 +1002,6 @@ public class TestRestTemplate { ...@@ -996,19 +1002,6 @@ public class TestRestTemplate {
return testRestTemplate; return testRestTemplate;
} }
private List<ClientHttpRequestInterceptor> removeBasicAuthInterceptorIfPresent(
List<ClientHttpRequestInterceptor> interceptors) {
List<ClientHttpRequestInterceptor> updatedInterceptors = new ArrayList<ClientHttpRequestInterceptor>(
interceptors);
Iterator<ClientHttpRequestInterceptor> iterator = updatedInterceptors.iterator();
while (iterator.hasNext()) {
if (iterator.next() instanceof BasicAuthorizationInterceptor) {
iterator.remove();
}
}
return interceptors;
}
/** /**
* Options used to customize the Apache Http Client if it is used. * Options used to customize the Apache Http Client if it is used.
*/ */
......
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -160,16 +160,15 @@ public class TestRestTemplateTests { ...@@ -160,16 +160,15 @@ public class TestRestTemplateTests {
.isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class); .isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class);
assertThat(basicAuthTemplate.getRestTemplate().getUriTemplateHandler()) assertThat(basicAuthTemplate.getRestTemplate().getUriTemplateHandler())
.isSameAs(originalTemplate.getRestTemplate().getUriTemplateHandler()); .isSameAs(originalTemplate.getRestTemplate().getUriTemplateHandler());
assertThat(basicAuthTemplate.getRestTemplate().getInterceptors()) assertThat(basicAuthTemplate.getRestTemplate().getInterceptors()).hasSize(1);
.containsExactlyElementsOf(
originalTemplate.getRestTemplate().getInterceptors());
assertBasicAuthorizationInterceptorCredentials(basicAuthTemplate, "user", assertBasicAuthorizationInterceptorCredentials(basicAuthTemplate, "user",
"password"); "password");
} }
@Test @Test
public void withBasicAuthReplacesBasicAuthInterceptorWhenAlreadyPresent() { public void withBasicAuthReplacesBasicAuthInterceptorWhenAlreadyPresent() {
TestRestTemplate original = new TestRestTemplate("foo", "bar"); TestRestTemplate original = new TestRestTemplate("foo", "bar")
.withBasicAuth("replace", "repalce");
TestRestTemplate basicAuth = original.withBasicAuth("user", "password"); TestRestTemplate basicAuth = original.withBasicAuth("user", "password");
assertThat(basicAuth.getRestTemplate().getMessageConverters()) assertThat(basicAuth.getRestTemplate().getMessageConverters())
.containsExactlyElementsOf( .containsExactlyElementsOf(
...@@ -181,8 +180,7 @@ public class TestRestTemplateTests { ...@@ -181,8 +180,7 @@ public class TestRestTemplateTests {
.isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class); .isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class);
assertThat(basicAuth.getRestTemplate().getUriTemplateHandler()) assertThat(basicAuth.getRestTemplate().getUriTemplateHandler())
.isSameAs(original.getRestTemplate().getUriTemplateHandler()); .isSameAs(original.getRestTemplate().getUriTemplateHandler());
assertThat(basicAuth.getRestTemplate().getInterceptors()) assertThat(basicAuth.getRestTemplate().getInterceptors()).hasSize(1);
.containsExactlyElementsOf(original.getRestTemplate().getInterceptors());
assertBasicAuthorizationInterceptorCredentials(basicAuth, "user", "password"); assertBasicAuthorizationInterceptorCredentials(basicAuth, "user", "password");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment