From 2596deb834c77df776d38378326ec15bc282bd64 Mon Sep 17 00:00:00 2001 From: Mark Hobson Date: Sat, 14 Jul 2018 13:04:13 +0100 Subject: [PATCH] Preserve media type parameters when setting charset Issue: SPR-17040 --- .../AbstractWireFeedHttpMessageConverter.java | 2 +- .../AtomFeedHttpMessageConverterTests.java | 18 ++++++++++++++++ .../RssChannelHttpMessageConverterTests.java | 21 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java index e196db666b2a..424a6d9f5d38 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java @@ -90,7 +90,7 @@ protected void writeInternal(T wireFeed, HttpOutputMessage outputMessage) Charset.forName(wireFeed.getEncoding()) : DEFAULT_CHARSET); MediaType contentType = outputMessage.getHeaders().getContentType(); if (contentType != null) { - contentType = new MediaType(contentType.getType(), contentType.getSubtype(), charset); + contentType = new MediaType(contentType, charset); outputMessage.getHeaders().setContentType(contentType); } diff --git a/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java index 1d7af4d85e42..2c82594a02a1 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java @@ -24,7 +24,9 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.rometools.rome.feed.atom.Entry; import com.rometools.rome.feed.atom.Feed; @@ -39,6 +41,8 @@ import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; +import static java.util.Collections.singletonMap; + /** * @author Arjen Poutsma */ @@ -130,4 +134,18 @@ public void writeOtherCharset() throws IOException, SAXException { outputMessage.getHeaders().getContentType()); } + @Test + public void writeOtherContentTypeParameters() throws IOException { + Feed feed = new Feed("atom_1.0"); + + MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); + converter.write(feed, new MediaType("application", "atom+xml", singletonMap("type", "feed")), outputMessage); + + Map expectedParameters = new HashMap<>(); + expectedParameters.put("charset", "UTF-8"); + expectedParameters.put("type", "feed"); + assertEquals("Invalid content-type", new MediaType("application", "atom+xml", expectedParameters), + outputMessage.getHeaders().getContentType()); + } + } diff --git a/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java index 80e3a4d21bf3..e8e793b14621 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java @@ -23,7 +23,9 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.rometools.rome.feed.rss.Channel; import com.rometools.rome.feed.rss.Item; @@ -36,6 +38,8 @@ import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; +import static java.util.Collections.singletonMap; + /** * @author Arjen Poutsma */ @@ -133,6 +137,23 @@ public void writeOtherCharset() throws IOException, SAXException { outputMessage.getHeaders().getContentType()); } + @Test + public void writeOtherContentTypeParameters() throws IOException { + Channel channel = new Channel("rss_2.0"); + channel.setTitle("title"); + channel.setLink("http://example.com"); + channel.setDescription("description"); + + MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); + converter.write(channel, new MediaType("application", "rss+xml", singletonMap("x", "y")), outputMessage); + + Map expectedParameters = new HashMap<>(); + expectedParameters.put("charset", "UTF-8"); + expectedParameters.put("x", "y"); + assertEquals("Invalid content-type", new MediaType("application", "rss+xml", expectedParameters), + outputMessage.getHeaders().getContentType()); + } + private static CompareMatcher isSimilarTo(final String content) { return CompareMatcher.isSimilarTo(content) .ignoreWhitespace();