From 73a81f98d40eb6f5faa91aceb868db53fae2a94b Mon Sep 17 00:00:00 2001 From: sdeleuze Date: Wed, 13 Dec 2017 10:08:24 +0100 Subject: [PATCH] Allow interceptors to add existing header values Additional commit to provide support of requests that have a body. Issue: SPR-15066 --- .../web/client/RestTemplate.java | 9 +++-- .../web/client/RestTemplateTests.java | 33 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index a287c4b5031..6c0de42191c 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -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 (GenericHttpMessageConverter) messageConverter; if (genericConverter.canWrite(requestBodyType, requestBodyClass, requestContentType)) { if (!requestHeaders.isEmpty()) { - httpRequest.getHeaders().putAll(requestHeaders); + for (Map.Entry> 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 } else if (messageConverter.canWrite(requestBodyClass, requestContentType)) { if (!requestHeaders.isEmpty()) { - httpRequest.getHeaders().putAll(requestHeaders); + for (Map.Entry> entry : requestHeaders.entrySet()) { + httpHeaders.put(entry.getKey(), new LinkedList<>(entry.getValue())); + } } if (logger.isDebugEnabled()) { if (requestContentType != null) { diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java index 8bd8289c9ae..53bba4e6c0c 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java @@ -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 { 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 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(); + } + }