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..5a62697950cd 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -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..1b057e584aec 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 @@ -27,7 +27,6 @@ import com.rometools.rome.feed.atom.Feed; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.xml.sax.SAXException; import org.xmlunit.diff.DefaultNodeMatcher; import org.xmlunit.diff.ElementSelectors; import org.xmlunit.diff.NodeMatcher; @@ -37,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; /** @@ -44,6 +44,10 @@ */ public class AtomFeedHttpMessageConverterTests { + private static final MediaType ATOM_XML_UTF8 = + new MediaType(MediaType.APPLICATION_ATOM_XML, StandardCharsets.UTF_8); + + private AtomFeedHttpMessageConverter converter; @@ -55,21 +59,21 @@ public void setUp() { @Test public void canRead() { - assertThat(converter.canRead(Feed.class, new MediaType("application", "atom+xml"))).isTrue(); - assertThat(converter.canRead(Feed.class, new MediaType("application", "atom+xml", StandardCharsets.UTF_8))).isTrue(); + assertThat(converter.canRead(Feed.class, MediaType.APPLICATION_ATOM_XML)).isTrue(); + assertThat(converter.canRead(Feed.class, ATOM_XML_UTF8)).isTrue(); } @Test public void canWrite() { - assertThat(converter.canWrite(Feed.class, new MediaType("application", "atom+xml"))).isTrue(); - assertThat(converter.canWrite(Feed.class, new MediaType("application", "atom+xml", StandardCharsets.UTF_8))).isTrue(); + assertThat(converter.canWrite(Feed.class, MediaType.APPLICATION_ATOM_XML)).isTrue(); + assertThat(converter.canWrite(Feed.class, ATOM_XML_UTF8)).isTrue(); } @Test public void read() throws IOException { InputStream is = getClass().getResourceAsStream("atom.xml"); MockHttpInputMessage inputMessage = new MockHttpInputMessage(is); - inputMessage.getHeaders().setContentType(new MediaType("application", "atom+xml", StandardCharsets.UTF_8)); + inputMessage.getHeaders().setContentType(ATOM_XML_UTF8); Feed result = converter.read(Feed.class, inputMessage); assertThat(result.getTitle()).isEqualTo("title"); assertThat(result.getSubtitle().getValue()).isEqualTo("subtitle"); @@ -86,7 +90,7 @@ public void read() throws IOException { } @Test - public void write() throws IOException, SAXException { + public void write() throws IOException { Feed feed = new Feed("atom_1.0"); feed.setTitle("title"); @@ -106,7 +110,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(ATOM_XML_UTF8); String expected = "" + "title" + "id1title1" + "id2title2"; @@ -116,7 +122,7 @@ public void write() throws IOException, SAXException { } @Test - public void writeOtherCharset() throws IOException, SAXException { + public void writeOtherCharset() throws IOException { Feed feed = new Feed("atom_1.0"); feed.setTitle("title"); String encoding = "ISO-8859-1"; @@ -125,7 +131,22 @@ 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 { + MockHttpOutputMessage message = new MockHttpOutputMessage(); + MediaType contentType = new MediaType("application", "atom+xml", singletonMap("type", "feed")); + converter.write(new Feed("atom_1.0"), contentType, message); + + assertThat(message.getHeaders().getContentType().getParameters()) + .as("Invalid content-type") + .hasSize(2) + .containsEntry("type", "feed") + .containsEntry("charset", "UTF-8"); } } 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..a720f16d3b53 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 @@ -27,13 +27,13 @@ import com.rometools.rome.feed.rss.Item; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.xml.sax.SAXException; import org.springframework.http.MediaType; import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; import org.springframework.tests.XmlContent; +import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; /** @@ -41,6 +41,10 @@ */ public class RssChannelHttpMessageConverterTests { + private static final MediaType RSS_XML_UTF8 = + new MediaType(MediaType.APPLICATION_RSS_XML, StandardCharsets.UTF_8); + + private RssChannelHttpMessageConverter converter; @@ -51,22 +55,19 @@ public void setUp() { @Test - public void canRead() { - assertThat(converter.canRead(Channel.class, new MediaType("application", "rss+xml"))).isTrue(); - assertThat(converter.canRead(Channel.class, new MediaType("application", "rss+xml", StandardCharsets.UTF_8))).isTrue(); - } + public void canReadAndWrite() { + assertThat(converter.canRead(Channel.class, MediaType.APPLICATION_RSS_XML)).isTrue(); + assertThat(converter.canRead(Channel.class, RSS_XML_UTF8)).isTrue(); - @Test - public void canWrite() { - assertThat(converter.canWrite(Channel.class, new MediaType("application", "rss+xml"))).isTrue(); - assertThat(converter.canWrite(Channel.class, new MediaType("application", "rss+xml", StandardCharsets.UTF_8))).isTrue(); + assertThat(converter.canWrite(Channel.class, MediaType.APPLICATION_RSS_XML)).isTrue(); + assertThat(converter.canWrite(Channel.class, RSS_XML_UTF8)).isTrue(); } @Test public void read() throws IOException { InputStream is = getClass().getResourceAsStream("rss.xml"); MockHttpInputMessage inputMessage = new MockHttpInputMessage(is); - inputMessage.getHeaders().setContentType(new MediaType("application", "rss+xml", StandardCharsets.UTF_8)); + inputMessage.getHeaders().setContentType(RSS_XML_UTF8); Channel result = converter.read(Channel.class, inputMessage); assertThat(result.getTitle()).isEqualTo("title"); assertThat(result.getLink()).isEqualTo("https://example.com"); @@ -83,7 +84,7 @@ public void read() throws IOException { } @Test - public void write() throws IOException, SAXException { + public void write() throws IOException { Channel channel = new Channel("rss_2.0"); channel.setTitle("title"); channel.setLink("https://example.com"); @@ -103,7 +104,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(RSS_XML_UTF8); String expected = "" + "titlehttps://example.comdescription" + "title1" + @@ -114,7 +117,7 @@ public void write() throws IOException, SAXException { } @Test - public void writeOtherCharset() throws IOException, SAXException { + public void writeOtherCharset() throws IOException { Channel channel = new Channel("rss_2.0"); channel.setTitle("title"); channel.setLink("https://example.com"); @@ -129,7 +132,26 @@ 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 message = new MockHttpOutputMessage(); + converter.write(channel, new MediaType("application", "rss+xml", singletonMap("x", "y")), message); + + assertThat(message.getHeaders().getContentType().getParameters()) + .as("Invalid content-type") + .hasSize(2) + .containsEntry("x", "y") + .containsEntry("charset", "UTF-8"); } }