INT-1951 fixed HttpRequestExecutingMessageHandler to ensure that it sets Content-Type only for POST and PUT requests

This commit is contained in:
Oleg Zhurakousky
2011-07-12 13:28:50 -04:00
parent 30b39da1d0
commit af7bc5ac74
2 changed files with 92 additions and 7 deletions

View File

@@ -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<Object> createHttpEntityWithMessageAsBody(Message<?> requestMessage) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "x-java-serialized-object"));
return new HttpEntity<Object>(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<Object>(requestMessage, httpHeaders);
}
@SuppressWarnings("unchecked")

View File

@@ -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){