From 68dfbbe3f0e46194eefffede41d5dae5acc25dee 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** # Conflicts: # spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java --- .../http/support/DefaultHttpHeaderMapper.java | 9 +++++---- ...ultHttpHeaderMapperFromMessageOutboundTests.java | 13 +++++++++++++ 2 files changed, 18 insertions(+), 4 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 e4c2bd5fa0..7a3c7c1e28 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.integration.support.utils.IntegrationUtils; 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; @@ -591,8 +592,8 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF if (!CollectionUtils.isEmpty(values)) { List acceptableMediaTypes = new ArrayList<>(); for (Object type : values) { - 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)); @@ -749,8 +750,8 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF } } else if (MessageHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) { - 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)); 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 3136e3d1d8..a135749f57 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 @@ -43,6 +43,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; /** @@ -345,6 +346,18 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { assertEquals("html", headers.getContentType().getSubtype()); } + @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); + assertEquals("text", headers.getContentType().getType()); + assertEquals("plain", headers.getContentType().getSubtype()); + } + // Date test @Test