]> uap-core.de Git - rssreader.git/commitdiff
enable followRedirects in the HttpClient
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 17 Sep 2025 16:16:05 +0000 (18:16 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 17 Sep 2025 16:16:05 +0000 (18:16 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/SyncJob.kt

index 00dfda29b0fee01011a84df5e64b755965855578..51932fa18fbb501d0cbccf6b0a9d6b21f6611523 100644 (file)
@@ -38,7 +38,7 @@ class SyncJob(feeds: () -> List<Feed>) {
 
     private suspend fun syncFeeds(feeds: List<Feed>) {
         coroutineScope {
-            val client = HttpClient.newBuilder().build()
+            val client = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL).build()
             val jobs = feeds.map { feed ->
                 async(Dispatchers.IO) {
                     try {
@@ -53,48 +53,51 @@ class SyncJob(feeds: () -> List<Feed>) {
                         val request = requestBuilder.build()
 
                         val response = client.send(request, HttpResponse.BodyHandlers.ofInputStream())
-                        if(response.statusCode() > 299) {
-                            throw Exception("HTTP error: ${response.statusCode()}")
-                        }
-                        response.body().use { stream ->
-                            val input = SyndFeedInput()
-                            val syndFeed = input.build(XmlReader(stream))
-                            val items = mutableListOf<Item>()
-                            println("Fetched feed: ${syndFeed.title}")
-                            syndFeed.entries.forEach { entry ->
-                                //println("  ${entry.title} - ${entry.link}")
+                        val statusCode = response.statusCode()
+                        if(statusCode > 299) {
+                            // TODO: handle 401
+                            throw Exception("HTTP error: ${statusCode}")
+                        } else {
+                            response.body().use { stream ->
+                                val input = SyndFeedInput()
+                                val syndFeed = input.build(XmlReader(stream))
+                                val items = mutableListOf<Item>()
+                                println("Fetched feed: ${syndFeed.title}")
+                                syndFeed.entries.forEach { entry ->
+                                    //println("  ${entry.title} - ${entry.link}")
 
-                                val item = Item(0)
-                                item.feedId = feed.id
-                                item.title = entry.title
-                                item.link = entry.link
-                                item.category = entry.categories.firstOrNull()?.name
-                                item.description = entry.description?.value
-                                item.author = entry.author
-                                entry.publishedDate?.let {
-                                    item.pubDate = it.toInstant()
-                                }
-                                entry.updatedDate?.let {
-                                    item.updated = it.toInstant()
-                                }
-                                item.guid = entry.uri
-                                val contents = entry.contents
-                                contents.forEach { content ->
-                                    if(content.type == null) {
-                                        item.contentText = content.value
-                                    } else {
-                                        if(content.type == "html") {
-                                            item.contentHtml = content.value
-                                        } else if(content.type == "text") {
+                                    val item = Item(0)
+                                    item.feedId = feed.id
+                                    item.title = entry.title
+                                    item.link = entry.link
+                                    item.category = entry.categories.firstOrNull()?.name
+                                    item.description = entry.description?.value
+                                    item.author = entry.author
+                                    entry.publishedDate?.let {
+                                        item.pubDate = it.toInstant()
+                                    }
+                                    entry.updatedDate?.let {
+                                        item.updated = it.toInstant()
+                                    }
+                                    item.guid = entry.uri
+                                    val contents = entry.contents
+                                    contents.forEach { content ->
+                                        if(content.type == null) {
                                             item.contentText = content.value
+                                        } else {
+                                            if(content.type == "html") {
+                                                item.contentHtml = content.value
+                                            } else if(content.type == "text") {
+                                                item.contentText = content.value
+                                            }
                                         }
                                     }
-                                }
 
-                                items.add(item)
+                                    items.add(item)
+                                }
+                                Database.addItems(items)
+                                Database.updateFeedDate(feed)
                             }
-                            Database.addItems(items)
-                            Database.updateFeedDate(feed)
                         }
                     } catch (e: Exception) {
                         println("Failed to fetch ${feed.uri}: ${e.message}")