From fd4b902b8d5df4372703cfb52384d2d9a8a43557 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 9 Apr 2022 08:10:32 +0300 Subject: [PATCH] [Remanga] Fix errors handling --- .../kotatsu/parsers/MangaLoaderContext.kt | 7 ++- .../kotatsu/parsers/site/RemangaParser.kt | 45 +++++++------------ .../kotatsu/parsers/MangaParserTest.kt | 2 +- 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt index cd93b6d8..7511b29d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaLoaderContext.kt @@ -91,8 +91,11 @@ abstract class MangaLoaderContext { abstract fun getConfig(source: MangaSource): MangaSourceConfig private fun Response.ensureSuccess() = apply { - if (!isSuccessful) { - val exception = HttpStatusException(message, code, request.url.toString()) + val exception: Exception? = when (code) { // Catch some error codes, not all + in 500..599 -> HttpStatusException(message, code, request.url.toString()) + else -> null + } + if (exception != null) { runCatching { close() }.onFailure { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt index d761564f..dd970c02 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt @@ -5,7 +5,6 @@ import okhttp3.Response import org.json.JSONArray import org.json.JSONException import org.json.JSONObject -import org.jsoup.HttpStatusException import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider @@ -113,12 +112,10 @@ internal class RemangaParser( val domain = getDomain() val slug = manga.url.find(regexLastUrlPath) ?: throw ParseException("Cannot obtain slug from ${manga.url}") - val data = catch401 { - context.httpGet( - url = "https://api.$domain/api/titles/$slug/", - headers = getApiHeaders(), - ) - }.parseJson() + val data = context.httpGet( + url = "https://api.$domain/api/titles/$slug/", + headers = getApiHeaders(), + ).handle401().parseJson() val content = try { data.getJSONObject("content") } catch (e: JSONException) { @@ -172,9 +169,9 @@ internal class RemangaParser( override suspend fun getPages(chapter: MangaChapter): List { val referer = "https://${getDomain()}/" - val content = catch401 { - context.httpGet(chapter.url.withDomain(subdomain = "api"), getApiHeaders()) - }.parseJson() + val content = context.httpGet(chapter.url.withDomain(subdomain = "api"), getApiHeaders()) + .handle401() + .parseJson() .getJSONObject("content") val pages = content.optJSONArray("pages") if (pages == null) { @@ -213,12 +210,10 @@ internal class RemangaParser( } override suspend fun getUsername(): String { - val jo = catch401 { - context.httpGet( - url = "https://api.${getDomain()}/api/users/current/", - headers = getApiHeaders(), - ) - }.parseJson() + val jo = context.httpGet( + url = "https://api.${getDomain()}/api/users/current/", + headers = getApiHeaders(), + ).handle401().parseJson() return jo.getJSONObject("content").getString("username") } @@ -256,12 +251,10 @@ internal class RemangaParser( val result = ArrayList(100) var page = 1 while (true) { - val content = catch401 { - context.httpGet( - url = "https://api.$domain/api/titles/chapters/?branch_id=$branchId&page=$page&count=100", - headers = getApiHeaders(), - ) - }.parseJson().getJSONArray("content") + val content = context.httpGet( + url = "https://api.$domain/api/titles/chapters/?branch_id=$branchId&page=$page&count=100", + headers = getApiHeaders(), + ).handle401().parseJson().getJSONArray("content") val len = content.length() if (len == 0) { break @@ -275,13 +268,9 @@ internal class RemangaParser( return result } - private inline fun catch401(block: () -> Response): Response = try { - block() - } catch (e: HttpStatusException) { - if (e.statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) { + private fun Response.handle401() = apply { + if (code == HttpURLConnection.HTTP_UNAUTHORIZED) { throw AuthRequiredException(source) - } else { - throw e } } } \ No newline at end of file diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 7fa41b5e..f8a32eb7 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -135,7 +135,7 @@ internal class MangaParserTest { for (item in list) { assert(item.url.isNotEmpty()) assert(!item.url.isUrlAbsoulte()) - assert(item.coverUrl.isUrlAbsoulte()) + assert(item.coverUrl.isUrlAbsoulte()) { "Cover url is not absolute: ${item.coverUrl}" } assert(item.title.isNotEmpty()) { "Title for ${item.publicUrl} is empty" } assert(item.publicUrl.isUrlAbsoulte()) }