Skip to content

Commit e6e6b8f

Browse files
committed
Allow interceptors to add existing header values
Additional commit to provide support of requests that have a body. Issue: SPR-15066
1 parent 4fe94df commit e6e6b8f

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -852,14 +852,17 @@ public void doWithRequest(ClientHttpRequest httpRequest) throws IOException {
852852
Class<?> requestBodyClass = requestBody.getClass();
853853
Type requestBodyType = (this.requestEntity instanceof RequestEntity ?
854854
((RequestEntity<?>)this.requestEntity).getType() : requestBodyClass);
855+
HttpHeaders httpHeaders = httpRequest.getHeaders();
855856
HttpHeaders requestHeaders = this.requestEntity.getHeaders();
856857
MediaType requestContentType = requestHeaders.getContentType();
857858
for (HttpMessageConverter<?> messageConverter : getMessageConverters()) {
858859
if (messageConverter instanceof GenericHttpMessageConverter) {
859860
GenericHttpMessageConverter<Object> genericMessageConverter = (GenericHttpMessageConverter<Object>) messageConverter;
860861
if (genericMessageConverter.canWrite(requestBodyType, requestBodyClass, requestContentType)) {
861862
if (!requestHeaders.isEmpty()) {
862-
httpRequest.getHeaders().putAll(requestHeaders);
863+
for (Map.Entry<String, List<String>> entry : requestHeaders.entrySet()) {
864+
httpHeaders.put(entry.getKey(), new LinkedList<String>(entry.getValue()));
865+
}
863866
}
864867
if (logger.isDebugEnabled()) {
865868
if (requestContentType != null) {
@@ -878,7 +881,9 @@ public void doWithRequest(ClientHttpRequest httpRequest) throws IOException {
878881
}
879882
else if (messageConverter.canWrite(requestBodyClass, requestContentType)) {
880883
if (!requestHeaders.isEmpty()) {
881-
httpRequest.getHeaders().putAll(requestHeaders);
884+
for (Map.Entry<String, List<String>> entry : requestHeaders.entrySet()) {
885+
httpHeaders.put(entry.getKey(), new LinkedList<String>(entry.getValue()));
886+
}
882887
}
883888
if (logger.isDebugEnabled()) {
884889
if (requestContentType != null) {

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

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,7 @@ public void exchangeParameterizedType() throws Exception {
836836
}
837837

838838
@Test // SPR-15066
839-
public void requestInterceptorCanAddExistingHeaderValue() throws Exception {
839+
public void requestInterceptorCanAddExistingHeaderValueWithoutBody() throws Exception {
840840
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
841841
request.getHeaders().add("MyHeader", "MyInterceptorValue");
842842
return execution.execute(request, body);
@@ -861,4 +861,35 @@ public void requestInterceptorCanAddExistingHeaderValue() throws Exception {
861861
verify(response).close();
862862
}
863863

864+
@Test // SPR-15066
865+
public void requestInterceptorCanAddExistingHeaderValueWithBody() throws Exception {
866+
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
867+
request.getHeaders().add("MyHeader", "MyInterceptorValue");
868+
return execution.execute(request, body);
869+
};
870+
template.setInterceptors(Collections.singletonList(interceptor));
871+
872+
MediaType contentType = MediaType.TEXT_PLAIN;
873+
given(converter.canWrite(String.class, contentType)).willReturn(true);
874+
given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request);
875+
String helloWorld = "Hello World";
876+
HttpHeaders requestHeaders = new HttpHeaders();
877+
given(request.getHeaders()).willReturn(requestHeaders);
878+
converter.write(helloWorld, contentType, request);
879+
given(request.execute()).willReturn(response);
880+
given(errorHandler.hasError(response)).willReturn(false);
881+
HttpStatus status = HttpStatus.OK;
882+
given(response.getStatusCode()).willReturn(status);
883+
given(response.getStatusText()).willReturn(status.getReasonPhrase());
884+
885+
HttpHeaders entityHeaders = new HttpHeaders();
886+
entityHeaders.setContentType(contentType);
887+
entityHeaders.add("MyHeader", "MyEntityValue");
888+
HttpEntity<String> entity = new HttpEntity<>(helloWorld, entityHeaders);
889+
template.exchange("http://example.com", HttpMethod.POST, entity, Void.class);
890+
assertThat(requestHeaders.get("MyHeader"), contains("MyEntityValue", "MyInterceptorValue"));
891+
892+
verify(response).close();
893+
}
894+
864895
}

0 commit comments

Comments
 (0)