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");
}
}