From 83ade3b9f6f9f04a8c7636b9bc17274897b4f58f 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 | 26 +++++++++++++++-- .../RssChannelHttpMessageConverterTests.java | 29 +++++++++++++++++-- 3 files changed, 52 insertions(+), 5 deletions(-) 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 bd2bd774e8b2..5494fe8a2929 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 bf2956f1b4b5..0c6da02d2cd9 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 @@ -21,7 +21,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; @@ -37,6 +39,7 @@ import org.springframework.http.MockHttpOutputMessage; import org.springframework.tests.XmlContent; +import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; /** @@ -106,7 +109,9 @@ public void write() throws IOException, SAXException { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); converter.write(feed, null, outputMessage); - assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content-type").isEqualTo(new MediaType("application", "atom+xml", StandardCharsets.UTF_8)); + assertThat(outputMessage.getHeaders().getContentType()) + .as("Invalid content-type") + .isEqualTo(new MediaType("application", "atom+xml", StandardCharsets.UTF_8)); String expected = "" + "title" + "id1title1" + "id2title2"; @@ -125,7 +130,24 @@ public void writeOtherCharset() throws IOException, SAXException { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); converter.write(feed, null, outputMessage); - assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content-type").isEqualTo(new MediaType("application", "atom+xml", Charset.forName(encoding))); + assertThat(outputMessage.getHeaders().getContentType()) + .as("Invalid content-type") + .isEqualTo(new MediaType("application", "atom+xml", Charset.forName(encoding))); + } + + @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"); + assertThat(outputMessage.getHeaders().getContentType()) + .as("Invalid content-type") + .isEqualTo(new MediaType("application", "atom+xml", expectedParameters)); } } 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 ea48f3523171..3d8c5e7d508c 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 @@ -21,7 +21,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; @@ -34,6 +36,7 @@ import org.springframework.http.MockHttpOutputMessage; import org.springframework.tests.XmlContent; +import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; /** @@ -103,7 +106,9 @@ public void write() throws IOException, SAXException { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); converter.write(channel, null, outputMessage); - assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content-type").isEqualTo(new MediaType("application", "rss+xml", StandardCharsets.UTF_8)); + assertThat(outputMessage.getHeaders().getContentType()) + .as("Invalid content-type") + .isEqualTo(new MediaType("application", "rss+xml", StandardCharsets.UTF_8)); String expected = "" + "titlehttps://example.comdescription" + "title1" + @@ -129,7 +134,27 @@ public void writeOtherCharset() throws IOException, SAXException { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); converter.write(channel, null, outputMessage); - assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content-type").isEqualTo(new MediaType("application", "rss+xml", Charset.forName(encoding))); + assertThat(outputMessage.getHeaders().getContentType()) + .as("Invalid content-type") + .isEqualTo(new MediaType("application", "rss+xml", Charset.forName(encoding))); + } + + @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"); + assertThat(outputMessage.getHeaders().getContentType()) + .as("Invalid content-type") + .isEqualTo(new MediaType("application", "rss+xml", expectedParameters)); } }