From a75f0808fda9c605d00221aada285477fa5ccb86 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Fri, 21 Jun 2019 12:45:43 -0400 Subject: [PATCH] Fix HttpHeaderMapper to support MimeType It turns out that `contentType` header (as well as `Accept`) may be converted into `MimeType` upstream before the message is sent into HTTP Outbound Channel Adapter meanwhile the logic is only to support String and MediaType * Change the `DefaultHttpHeaderMapper` to support more generic `MimeType` for the `Content-Type` and `Accept` HTTP headers which can simply be converted to the expected `MediaType` **Cherry-pick to 5.1.x & 5.0.x** --- .../http/support/DefaultHttpHeaderMapper.java | 15 +++++++++------ ...tHttpHeaderMapperFromMessageOutboundTests.java | 13 +++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java b/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java index 5b253cbc44..de7e361a7d 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java @@ -55,6 +55,7 @@ import org.springframework.lang.Nullable; import org.springframework.messaging.MessageHeaders; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import org.springframework.util.MimeType; import org.springframework.util.ObjectUtils; import org.springframework.util.PatternMatchUtils; import org.springframework.util.StringUtils; @@ -740,15 +741,16 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF if (!CollectionUtils.isEmpty(valuesToAccept)) { List acceptableMediaTypes = new ArrayList<>(); for (Object type : valuesToAccept) { - if (type instanceof MediaType) { - acceptableMediaTypes.add((MediaType) type); + if (type instanceof MimeType) { + acceptableMediaTypes.add(MediaType.asMediaType((MimeType) type)); } else if (type instanceof String) { acceptableMediaTypes.addAll(MediaType.parseMediaTypes((String) type)); } else { throwIllegalArgumentForUnexpectedValue( - "Expected MediaType or String value for 'Accept' header value, but received: ", type); + "Expected org.springframework.util.MimeType " + + "or String value for 'Accept' header value, but received: ", type); } } @@ -841,15 +843,16 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF } private void setContentType(HttpHeaders target, Object value) { - if (value instanceof MediaType) { - target.setContentType((MediaType) value); + if (value instanceof MimeType) { + target.setContentType(MediaType.asMediaType((MimeType) value)); } else if (value instanceof String) { target.setContentType(MediaType.parseMediaType((String) value)); } else { throwIllegalArgumentForUnexpectedValue( - "Expected MediaType or String value for 'Content-Type' header value, but received: ", value); + "Expected org.springframework.util.MimeType " + + "or String value for 'Content-Type' header value, but received: ", value); } } diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java index 6640156d19..cc3dd6a21b 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java @@ -40,6 +40,7 @@ import org.springframework.integration.mapping.HeaderMapper; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; +import org.springframework.util.MimeType; import org.springframework.util.StopWatch; /** @@ -343,6 +344,18 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { assertThat(headers.getContentType().getSubtype()).isEqualTo("html"); } + @Test + public void validateContentTypeAsMimeType() { + HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); + Map messageHeaders = new HashMap<>(); + messageHeaders.put(MessageHeaders.CONTENT_TYPE, new MimeType("text", "plain")); + HttpHeaders headers = new HttpHeaders(); + + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); + assertThat(headers.getContentType().getType()).isEqualTo("text"); + assertThat(headers.getContentType().getSubtype()).isEqualTo("plain"); + } + // Date test @Test