Skip to content

Commit 73a81f9

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 583201b commit 73a81f9

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
@@ -922,6 +922,7 @@ public void doWithRequest(ClientHttpRequest httpRequest) throws IOException {
922922
Class<?> requestBodyClass = requestBody.getClass();
923923
Type requestBodyType = (this.requestEntity instanceof RequestEntity ?
924924
((RequestEntity<?>)this.requestEntity).getType() : requestBodyClass);
925+
HttpHeaders httpHeaders = httpRequest.getHeaders();
925926
HttpHeaders requestHeaders = this.requestEntity.getHeaders();
926927
MediaType requestContentType = requestHeaders.getContentType();
927928
for (HttpMessageConverter<?> messageConverter : getMessageConverters()) {
@@ -930,7 +931,9 @@ public void doWithRequest(ClientHttpRequest httpRequest) throws IOException {
930931
(GenericHttpMessageConverter<Object>) messageConverter;
931932
if (genericConverter.canWrite(requestBodyType, requestBodyClass, requestContentType)) {
932933
if (!requestHeaders.isEmpty()) {
933-
httpRequest.getHeaders().putAll(requestHeaders);
934+
for (Map.Entry<String, List<String>> entry : requestHeaders.entrySet()) {
935+
httpHeaders.put(entry.getKey(), new LinkedList<>(entry.getValue()));
936+
}
934937
}
935938
if (logger.isDebugEnabled()) {
936939
if (requestContentType != null) {
@@ -948,7 +951,9 @@ public void doWithRequest(ClientHttpRequest httpRequest) throws IOException {
948951
}
949952
else if (messageConverter.canWrite(requestBodyClass, requestContentType)) {
950953
if (!requestHeaders.isEmpty()) {
951-
httpRequest.getHeaders().putAll(requestHeaders);
954+
for (Map.Entry<String, List<String>> entry : requestHeaders.entrySet()) {
955+
httpHeaders.put(entry.getKey(), new LinkedList<>(entry.getValue()));
956+
}
952957
}
953958
if (logger.isDebugEnabled()) {
954959
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
@@ -826,7 +826,7 @@ public void exchangeParameterizedType() throws Exception {
826826
}
827827

828828
@Test // SPR-15066
829-
public void requestInterceptorCanAddExistingHeaderValue() throws Exception {
829+
public void requestInterceptorCanAddExistingHeaderValueWithoutBody() throws Exception {
830830
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
831831
request.getHeaders().add("MyHeader", "MyInterceptorValue");
832832
return execution.execute(request, body);
@@ -851,4 +851,35 @@ public void requestInterceptorCanAddExistingHeaderValue() throws Exception {
851851
verify(response).close();
852852
}
853853

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

0 commit comments

Comments
 (0)