Skip to content

Commit 6066201

Browse files
authored
Merge pull request #1618 from DimensionDev/bugfix/rss_nullable_description
fix: make RSS description nullable to prevent crashes on null values
2 parents 50e7aed + d2d11ca commit 6066201

File tree

4 files changed

+17
-28
lines changed

4 files changed

+17
-28
lines changed

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/rss/RssTimelineRemoteMediator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ internal class RssTimelineRemoteMediator(
104104
content = StatusContent.Rss(it),
105105
text =
106106
it.data.description
107-
.let { html -> parseHtml(html) }
108-
.wholeText(),
107+
?.let { html -> parseHtml(html) }
108+
?.wholeText(),
109109
createdAt =
110110
it.data.date?.let { parseRssDateToInstant(it) }
111111
?: Clock.System.now(),

shared/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/RssService.kt

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@ import dev.dimension.flare.data.network.ktorClient
55
import dev.dimension.flare.data.network.rss.model.Feed
66
import dev.dimension.flare.data.repository.tryRun
77
import dev.dimension.flare.ui.model.mapper.link
8-
import io.ktor.client.call.body
9-
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
108
import io.ktor.client.request.get
119
import io.ktor.client.statement.bodyAsText
12-
import io.ktor.http.ContentType
1310
import io.ktor.http.Url
14-
import io.ktor.serialization.kotlinx.xml.xml
1511
import kotlinx.serialization.decodeFromString
1612
import nl.adaptivity.xmlutil.serialization.XML
1713

@@ -25,16 +21,15 @@ internal object RssService {
2521
defaultToGenericParser = true
2622
}
2723
}
24+
private val client = ktorClient { }
2825

29-
suspend fun fetch(url: String): Feed =
30-
ktorClient(config = {
31-
install(ContentNegotiation) {
32-
xml(xml, contentType = ContentType.Any)
33-
}
34-
}).get(url).body()
26+
suspend fun fetch(url: String): Feed {
27+
val response = client.get(url).bodyAsText()
28+
return xml.decodeFromString(response)
29+
}
3530

3631
suspend fun detectLinkSources(url: String): List<String> =
37-
ktorClient()
32+
client
3833
.get(url)
3934
.bodyAsText()
4035
.let(Ksoup::parse)
@@ -53,9 +48,7 @@ internal object RssService {
5348
suspend fun fetchIcon(url: String): String? {
5449
val webContent =
5550
tryRun {
56-
ktorClient(
57-
config = {},
58-
).get(url).bodyAsText()
51+
client.get(url).bodyAsText()
5952
}.getOrNull() ?: return null
6053
val feed =
6154
tryRun {
@@ -76,9 +69,7 @@ internal object RssService {
7669
val html =
7770
if (feed?.link != null && feed.link != url) {
7871
tryRun {
79-
ktorClient(
80-
config = {},
81-
).get(feedLink).bodyAsText()
72+
client.get(feedLink).bodyAsText()
8273
}.getOrNull() ?: return null
8374
} else {
8475
webContent
@@ -106,9 +97,7 @@ internal object RssService {
10697
val hasFavIcon =
10798
tryRun {
10899
val response =
109-
ktorClient(
110-
config = {},
111-
).get(favIcon)
100+
client.get(favIcon)
112101
if (response.status.value !in 200..299) {
113102
throw Exception("Failed to fetch favicon: ${response.status}")
114103
}

shared/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/Feed.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ internal sealed interface Feed {
257257
@XmlElement(true)
258258
val link: String,
259259
@XmlElement(true)
260-
val description: String,
260+
val description: String? = null,
261261
@XmlElement(true)
262262
val language: String? = null,
263263
@XmlElement(true)
@@ -404,7 +404,7 @@ internal sealed interface Feed {
404404
@XmlElement(true)
405405
val link: String,
406406
@XmlElement(true)
407-
val description: String,
407+
val description: String? = null,
408408
@XmlElement(true)
409409
@XmlSerialName(value = "date", namespace = "http://purl.org/dc/elements/1.1/", prefix = "dc")
410410
val date: String? = null,
@@ -417,7 +417,7 @@ internal sealed interface Feed {
417417
@XmlElement(true)
418418
val link: String,
419419
@XmlElement(true)
420-
val description: String,
420+
val description: String? = null,
421421
@XmlElement(true)
422422
@XmlSerialName(value = "date", namespace = "http://purl.org/dc/elements/1.1/", prefix = "dc")
423423
val date: String? = null,

shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Rss.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,16 @@ internal fun StatusContent.Rss.RssContent.Rss20.render(): UiTimeline =
101101
internal fun StatusContent.Rss.RssContent.RDF.render(): UiTimeline =
102102
with(data) {
103103
val descHtml =
104-
description.let {
104+
description?.let {
105105
Ksoup.parse(it)
106106
}
107-
val img = descHtml.select("img").firstOrNull()
107+
val img = descHtml?.select("img")?.firstOrNull()
108108
return UiTimeline(
109109
topMessage = null,
110110
content =
111111
UiTimeline.ItemContent.Feed(
112112
title = title,
113-
description = descHtml.text(),
113+
description = descHtml?.text(),
114114
url = link.replace("http://", "https://"),
115115
image = img?.attr("src"),
116116
source = source,

0 commit comments

Comments
 (0)