From d4875a8e7dd96e365392cf48627af80d4664aa79 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Oct 2022 18:08:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/lib/webdav/WebDav.kt | 22 ++++++++++++++----- .../legado/app/lib/webdav/WebDavException.kt | 6 +++-- .../app/ui/book/info/BookInfoViewModel.kt | 13 +++++++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 6b11c816b..d028d4953 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -62,12 +62,14 @@ open class WebDav(val path: String, val authorization: Authorization) { private val url: URL = URL(path) private val httpUrl: String? by lazy { - val raw = url.toString().replace("davs://", "https://").replace("dav://", "http://") + val raw = url.toString() + .replace("davs://", "https://") + .replace("dav://", "http://") return@lazy kotlin.runCatching { URLEncoder.encode(raw, "UTF-8") - .replace("\\+".toRegex(), "%20") - .replace("%3A".toRegex(), ":") - .replace("%2F".toRegex(), "/") + .replace("+", "%20") + .replace("%3A", ":") + .replace("%2F", "/") }.getOrNull() } private val webDavClient by lazy { @@ -348,7 +350,17 @@ open class WebDav(val path: String, val authorization: Authorization) { */ private fun checkResult(response: Response) { if (!response.isSuccessful) { - throw WebDavException("${url}\n${response.code}:${response.message}") + val body = response.body?.string() + if (response.message.isNotBlank() || body.isNullOrBlank()) { + throw WebDavException("${url}\n${response.code}:${response.message}") + } + val document = Jsoup.parse(body) + val exception = document.getElementsByTag("s:exception").firstOrNull()?.text() + val message = document.getElementsByTag("s:message").firstOrNull()?.text() + if (exception == "ObjectNotFound") { + throw ObjectNotFoundException(message ?: "$path doesn't exist") + } + throw WebDavException(message ?: "未知错误") } } diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDavException.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDavException.kt index 08cb38132..210fff73d 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDavException.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDavException.kt @@ -1,9 +1,11 @@ package io.legado.app.lib.webdav -class WebDavException(msg: String) : Exception(msg) { +open class WebDavException(msg: String) : Exception(msg) { override fun fillInStackTrace(): Throwable { return this } -} \ No newline at end of file +} + +class ObjectNotFoundException(msg: String) : WebDavException(msg) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 62b01444e..bcbb6fc11 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -19,12 +19,14 @@ import io.legado.app.help.book.BookHelp import io.legado.app.help.book.getRemoteUrl import io.legado.app.help.book.isLocal import io.legado.app.help.coroutine.Coroutine +import io.legado.app.lib.webdav.ObjectNotFoundException import io.legado.app.model.BookCover import io.legado.app.model.ReadBook import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.localBook.LocalBook import io.legado.app.model.remote.RemoteBookWebDav import io.legado.app.model.webBook.WebBook +import io.legado.app.utils.isContentScheme import io.legado.app.utils.postEvent import io.legado.app.utils.toastOnUi import kotlinx.coroutines.CoroutineScope @@ -120,12 +122,19 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { book.origin = BookType.localTag } else if (remoteBook.lastModify > book.lastCheckTime) { val uri = RemoteBookWebDav.downloadRemoteBook(remoteBook) - + book.origin = if (uri.isContentScheme()) uri.toString() else uri.path!! } } } }.onError { - AppLog.put("下载远程书籍<${book.name}>失败", it) + when (it) { + is ObjectNotFoundException -> { + book.origin = BookType.localTag + } + else -> { + AppLog.put("下载远程书籍<${book.name}>失败", it) + } + } }.onFinally { loadBookInfo(book, false) }