Skip to content

Commit 4b5cef1

Browse files
committed
fix: invalid bytes in character encoding
1 parent f6b461d commit 4b5cef1

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

app/src/main/java/run/halo/feed/RssXmlBuilder.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.time.ZoneOffset;
88
import java.time.format.DateTimeFormatter;
99
import java.util.List;
10+
import java.util.Optional;
1011
import lombok.extern.slf4j.Slf4j;
1112
import org.apache.commons.lang3.StringUtils;
1213
import org.dom4j.Document;
@@ -146,9 +147,13 @@ private void createItemElementsToChannel(Element channel, List<RSS2.Item> items)
146147

147148
private void createItemElementToChannel(Element channel, RSS2.Item item) {
148149
Element itemElement = channel.addElement("item");
149-
itemElement.addElement("title").addCDATA(item.getTitle());
150+
itemElement.addElement("title")
151+
.addCDATA(XmlCharUtils.removeInvalidXmlChar(item.getTitle()));
150152
itemElement.addElement("link").addText(item.getLink());
151-
var description = getDescriptionWithTelemetry(item);
153+
154+
var description = Optional.of(getDescriptionWithTelemetry(item))
155+
.map(XmlCharUtils::removeInvalidXmlChar)
156+
.orElseThrow();
152157
itemElement.addElement("description").addCDATA(description);
153158
itemElement.addElement("guid")
154159
.addAttribute("isPermaLink", "false")

app/src/test/java/run/halo/feed/RSS2Test.java

+55
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.time.Instant;
66
import java.util.Arrays;
7+
import java.util.Collections;
78
import org.junit.jupiter.api.Test;
89

910
class RSS2Test {
@@ -130,4 +131,58 @@ void extractRssTagsTest() {
130131
""".formatted(lastBuildDate);
131132
assertThat(rssXml).isEqualToIgnoringWhitespace(expected);
132133
}
134+
135+
@Test
136+
void invalidCharTest() {
137+
var rss = RSS2.builder()
138+
.title("title")
139+
.description("description")
140+
.link("link")
141+
.items(Collections.singletonList(
142+
RSS2.Item.builder()
143+
.title("title1")
144+
.description("""
145+
<p>并且会保留处理后的图片以供后面的访问。</p>
146+
""")
147+
.link("link1")
148+
.pubDate(Instant.EPOCH)
149+
.guid("guid1")
150+
.build()
151+
))
152+
.build();
153+
var instant = Instant.now();
154+
var rssXml = new RssXmlBuilder()
155+
.withRss2(rss)
156+
.withGenerator("Halo")
157+
.withLastBuildDate(instant)
158+
.toXmlString();
159+
160+
var lastBuildDate = RssXmlBuilder.instantToString(instant);
161+
// language=xml
162+
var expected = """
163+
<?xml version="1.0" encoding="UTF-8"?>
164+
<rss xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
165+
<channel>
166+
<title>title</title>
167+
<link>link</link>
168+
<description>description</description>
169+
<generator>Halo</generator>
170+
<language>zh-cn</language>
171+
<lastBuildDate>%s</lastBuildDate>
172+
<item>
173+
<title>
174+
<![CDATA[title1]]>
175+
</title>
176+
<link>link1</link>
177+
<description>
178+
<![CDATA[<p>并且会保留处理后的图片以供后面的访问。</p>]]>
179+
</description>
180+
<guid isPermaLink="false">guid1</guid>
181+
<pubDate>Thu, 1 Jan 1970 00:00:00 GMT</pubDate>
182+
</item>
183+
</channel>
184+
</rss>
185+
""".formatted(lastBuildDate);
186+
assertThat(rssXml).isEqualToIgnoringWhitespace(expected);
187+
}
133188
}

0 commit comments

Comments
 (0)