Browse Source

Allow interceptors to add existing header values

Additional commit to provide support of requests
that have a body.

Issue: SPR-15066
pull/1602/merge
sdeleuze 8 years ago
parent
commit
73a81f98d4
  1. 9
      spring-web/src/main/java/org/springframework/web/client/RestTemplate.java
  2. 33
      spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java

9
spring-web/src/main/java/org/springframework/web/client/RestTemplate.java

@ -922,6 +922,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @@ -922,6 +922,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
Class<?> requestBodyClass = requestBody.getClass();
Type requestBodyType = (this.requestEntity instanceof RequestEntity ?
((RequestEntity<?>)this.requestEntity).getType() : requestBodyClass);
HttpHeaders httpHeaders = httpRequest.getHeaders();
HttpHeaders requestHeaders = this.requestEntity.getHeaders();
MediaType requestContentType = requestHeaders.getContentType();
for (HttpMessageConverter<?> messageConverter : getMessageConverters()) {
@ -930,7 +931,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @@ -930,7 +931,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
(GenericHttpMessageConverter<Object>) messageConverter;
if (genericConverter.canWrite(requestBodyType, requestBodyClass, requestContentType)) {
if (!requestHeaders.isEmpty()) {
httpRequest.getHeaders().putAll(requestHeaders);
for (Map.Entry<String, List<String>> entry : requestHeaders.entrySet()) {
httpHeaders.put(entry.getKey(), new LinkedList<>(entry.getValue()));
}
}
if (logger.isDebugEnabled()) {
if (requestContentType != null) {
@ -948,7 +951,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @@ -948,7 +951,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
}
else if (messageConverter.canWrite(requestBodyClass, requestContentType)) {
if (!requestHeaders.isEmpty()) {
httpRequest.getHeaders().putAll(requestHeaders);
for (Map.Entry<String, List<String>> entry : requestHeaders.entrySet()) {
httpHeaders.put(entry.getKey(), new LinkedList<>(entry.getValue()));
}
}
if (logger.isDebugEnabled()) {
if (requestContentType != null) {

33
spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java

@ -826,7 +826,7 @@ public class RestTemplateTests { @@ -826,7 +826,7 @@ public class RestTemplateTests {
}
@Test // SPR-15066
public void requestInterceptorCanAddExistingHeaderValue() throws Exception {
public void requestInterceptorCanAddExistingHeaderValueWithoutBody() throws Exception {
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
request.getHeaders().add("MyHeader", "MyInterceptorValue");
return execution.execute(request, body);
@ -851,4 +851,35 @@ public class RestTemplateTests { @@ -851,4 +851,35 @@ public class RestTemplateTests {
verify(response).close();
}
@Test // SPR-15066
public void requestInterceptorCanAddExistingHeaderValueWithBody() throws Exception {
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
request.getHeaders().add("MyHeader", "MyInterceptorValue");
return execution.execute(request, body);
};
template.setInterceptors(Collections.singletonList(interceptor));
MediaType contentType = MediaType.TEXT_PLAIN;
given(converter.canWrite(String.class, contentType)).willReturn(true);
given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request);
String helloWorld = "Hello World";
HttpHeaders requestHeaders = new HttpHeaders();
given(request.getHeaders()).willReturn(requestHeaders);
converter.write(helloWorld, contentType, request);
given(request.execute()).willReturn(response);
given(errorHandler.hasError(response)).willReturn(false);
HttpStatus status = HttpStatus.OK;
given(response.getStatusCode()).willReturn(status);
given(response.getStatusText()).willReturn(status.getReasonPhrase());
HttpHeaders entityHeaders = new HttpHeaders();
entityHeaders.setContentType(contentType);
entityHeaders.add("MyHeader", "MyEntityValue");
HttpEntity<String> entity = new HttpEntity<>(helloWorld, entityHeaders);
template.exchange("http://example.com", HttpMethod.POST, entity, Void.class);
assertThat(requestHeaders.get("MyHeader"), contains("MyEntityValue", "MyInterceptorValue"));
verify(response).close();
}
}

Loading…
Cancel
Save