Răsfoiți Sursa

fix: 修复自建WebDav服务使用WebDav书籍的一些BUG

1. 增加 resourceType 加强判断是否是文件夹,有些自建服务 文件夹 contentType 属性为空
2. 修复自建服务对文件夹存在性判断的问题
谢意帆 4 ani în urmă
părinte
comite
512ffcfcfd

+ 9 - 2
app/src/main/java/io/legado/app/lib/webdav/WebDav.kt

@@ -137,6 +137,9 @@ open class WebDav(val path: String, val authorization: Authorization) {
                         val contentType = element
                         val contentType = element
                             .getElementsByTag("d:getcontenttype")
                             .getElementsByTag("d:getcontenttype")
                             .firstOrNull()?.text().orEmpty()
                             .firstOrNull()?.text().orEmpty()
+                        val resourceType = element
+                            .getElementsByTag("d:resourcetype")
+                            .firstOrNull()?.html()?.trim().orEmpty()
                         val size = kotlin.runCatching {
                         val size = kotlin.runCatching {
                             element.getElementsByTag("d:getcontentlength")
                             element.getElementsByTag("d:getcontentlength")
                                 .firstOrNull()?.text()?.toLong() ?: 0
                                 .firstOrNull()?.text()?.toLong() ?: 0
@@ -155,6 +158,7 @@ open class WebDav(val path: String, val authorization: Authorization) {
                             urlName = urlName,
                             urlName = urlName,
                             size = size,
                             size = size,
                             contentType = contentType,
                             contentType = contentType,
+                            resourceType = resourceType,
                             lastModify = lastModify
                             lastModify = lastModify
                         )
                         )
                         list.add(webDavFile)
                         list.add(webDavFile)
@@ -171,11 +175,14 @@ open class WebDav(val path: String, val authorization: Authorization) {
      * 文件是否存在
      * 文件是否存在
      */
      */
     suspend fun exists(): Boolean {
     suspend fun exists(): Boolean {
+        val url = httpUrl ?: return false
+        //当使用自建的WebDav服务时,在末尾有否 ”/“ 会影响请求的成功与否
+        //使用坚果云的WebDav则不会,这里做一个简单的替换来解决这个问题
+        val testUrl = url.removeSuffix("/") + "/"
         return kotlin.runCatching {
         return kotlin.runCatching {
             return okHttpClient.newCallResponse {
             return okHttpClient.newCallResponse {
-                url(url)
+                url(testUrl)
                 addHeader(authorization.name, authorization.data)
                 addHeader(authorization.name, authorization.data)
-                head()
             }.code == 200
             }.code == 200
         }.getOrDefault(false)
         }.getOrDefault(false)
     }
     }

+ 2 - 1
app/src/main/java/io/legado/app/lib/webdav/WebDavFile.kt

@@ -11,11 +11,12 @@ class WebDavFile(
     val urlName: String,
     val urlName: String,
     val size: Long,
     val size: Long,
     val contentType: String,
     val contentType: String,
+    val resourceType: String,
     val lastModify: Long
     val lastModify: Long
 ) : WebDav(urlStr, authorization) {
 ) : WebDav(urlStr, authorization) {
 
 
     val isDir by lazy {
     val isDir by lazy {
-        contentType == "httpd/unix-directory"
+        contentType == "httpd/unix-directory" || resourceType.lowercase() == "<d:collection />"
     }
     }
 
 
 }
 }