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**
This commit is contained in:
Artem Bilan
2019-06-21 12:45:43 -04:00
committed by Gary Russell
parent f04962301d
commit a75f0808fd
2 changed files with 22 additions and 6 deletions

View File

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

View File

@@ -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<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);
assertThat(headers.getContentType().getType()).isEqualTo("text");
assertThat(headers.getContentType().getSubtype()).isEqualTo("plain");
}
// Date test
@Test