From af7bc5ac7429aa4135b9c78331762e2189e66edb Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 12 Jul 2011 13:28:50 -0400 Subject: [PATCH] INT-1951 fixed HttpRequestExecutingMessageHandler to ensure that it sets Content-Type only for POST and PUT requests --- .../HttpRequestExecutingMessageHandler.java | 22 ++++-- ...tpRequestExecutingMessageHandlerTests.java | 77 +++++++++++++++++++ 2 files changed, 92 insertions(+), 7 deletions(-) diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java index 948b30cd7b..05c4978c2e 100755 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java @@ -282,11 +282,15 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe HttpHeaders httpHeaders = new HttpHeaders(); this.headerMapper.fromHeaders(requestMessage.getHeaders(), httpHeaders); Object payload = requestMessage.getPayload(); - if (httpHeaders.getContentType() == null) { - MediaType contentType = (payload instanceof String) ? this.resolveContentType((String) payload, this.charset) - : this.resolveContentType(payload); - httpHeaders.setContentType(contentType); + + if (HttpMethod.POST.equals(this.httpMethod) || HttpMethod.PUT.equals(this.httpMethod)) { //INT-1951 + if (httpHeaders.getContentType() == null) { + MediaType contentType = (payload instanceof String) ? this.resolveContentType((String) payload, this.charset) + : this.resolveContentType(payload); + httpHeaders.setContentType(contentType); + } } + if (MediaType.APPLICATION_FORM_URLENCODED.equals(httpHeaders.getContentType()) || MediaType.MULTIPART_FORM_DATA.equals(httpHeaders.getContentType())) { if (!(payload instanceof MultiValueMap)) { @@ -300,9 +304,13 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe } private HttpEntity createHttpEntityWithMessageAsBody(Message requestMessage) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(new MediaType("application", "x-java-serialized-object")); - return new HttpEntity(requestMessage, headers); + HttpHeaders httpHeaders = new HttpHeaders(); + + if (HttpMethod.POST.equals(this.httpMethod) || HttpMethod.PUT.equals(this.httpMethod)) { //INT-1951 + httpHeaders.setContentType(new MediaType("application", "x-java-serialized-object")); + } + + return new HttpEntity(requestMessage, httpHeaders); } @SuppressWarnings("unchecked") diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java index c671b216da..d606d4df5e 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.http.outbound; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -72,6 +73,7 @@ public class HttpRequestExecutingMessageHandlerTests { assertEquals("intentional", exception.getCause().getMessage()); HttpEntity request = template.lastRequestEntity.get(); Object body = request.getBody(); + assertNotNull(request.getHeaders().getContentType()); assertTrue(body instanceof MultiValueMap); MultiValueMap map = (MultiValueMap ) body; assertEquals("1", map.get("a").iterator().next()); @@ -528,6 +530,81 @@ public class HttpRequestExecutingMessageHandlerTests { assertEquals(MediaType.TEXT_XML, request.getHeaders().getContentType()); } + @Test + public void contentTypeIsNotSet() throws Exception { + //GET + HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://www.springsource.org/spring-integration"); + MockRestTemplate template = new MockRestTemplate(); + new DirectFieldAccessor(handler).setPropertyValue("restTemplate", template); + handler.setHttpMethod(HttpMethod.GET); + + Message message = MessageBuilder.withPayload(mock(Source.class)).build(); + Exception exception = null; + try { + handler.handleMessage(message); + } + catch (Exception e) { + exception = e; + } + assertEquals("intentional", exception.getCause().getMessage()); + HttpEntity request = template.lastRequestEntity.get(); + assertNull(request.getHeaders().getContentType()); + + //HEAD + handler = new HttpRequestExecutingMessageHandler("http://www.springsource.org/spring-integration"); + template = new MockRestTemplate(); + new DirectFieldAccessor(handler).setPropertyValue("restTemplate", template); + handler.setHttpMethod(HttpMethod.HEAD); + + message = MessageBuilder.withPayload(mock(Source.class)).build(); + exception = null; + try { + handler.handleMessage(message); + } + catch (Exception e) { + exception = e; + } + assertEquals("intentional", exception.getCause().getMessage()); + request = template.lastRequestEntity.get(); + assertNull(request.getHeaders().getContentType()); + + //DELETE + handler = new HttpRequestExecutingMessageHandler("http://www.springsource.org/spring-integration"); + template = new MockRestTemplate(); + new DirectFieldAccessor(handler).setPropertyValue("restTemplate", template); + handler.setHttpMethod(HttpMethod.DELETE); + + message = MessageBuilder.withPayload(mock(Source.class)).build(); + exception = null; + try { + handler.handleMessage(message); + } + catch (Exception e) { + exception = e; + } + assertEquals("intentional", exception.getCause().getMessage()); + request = template.lastRequestEntity.get(); + assertNull(request.getHeaders().getContentType()); + + //TRACE + handler = new HttpRequestExecutingMessageHandler("http://www.springsource.org/spring-integration"); + template = new MockRestTemplate(); + new DirectFieldAccessor(handler).setPropertyValue("restTemplate", template); + handler.setHttpMethod(HttpMethod.TRACE); + + message = MessageBuilder.withPayload(mock(Source.class)).build(); + exception = null; + try { + handler.handleMessage(message); + } + catch (Exception e) { + exception = e; + } + assertEquals("intentional", exception.getCause().getMessage()); + request = template.lastRequestEntity.get(); + assertNull(request.getHeaders().getContentType()); + } + public static class City{ private String name; public City(String name){