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
This commit is contained in:
Artem Bilan
2019-06-21 12:45:43 -04:00
parent eea5089d69
commit 68dfbbe3f0
2 changed files with 18 additions and 4 deletions

View File

@@ -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<HttpHeaders>, BeanF
if (!CollectionUtils.isEmpty(values)) {
List<MediaType> 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<HttpHeaders>, 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));

View File

@@ -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<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> 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