|
@@ -7,9 +7,7 @@ import io.legado.app.exception.NoStackTraceException
|
|
|
import io.legado.app.help.http.newCallResponse
|
|
import io.legado.app.help.http.newCallResponse
|
|
|
import io.legado.app.help.http.okHttpClient
|
|
import io.legado.app.help.http.okHttpClient
|
|
|
import io.legado.app.help.http.text
|
|
import io.legado.app.help.http.text
|
|
|
-import io.legado.app.utils.NetworkUtils
|
|
|
|
|
-import io.legado.app.utils.printOnDebug
|
|
|
|
|
-import io.legado.app.utils.toRequestBody
|
|
|
|
|
|
|
+import io.legado.app.utils.*
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
import kotlinx.coroutines.withContext
|
|
import kotlinx.coroutines.withContext
|
|
|
import okhttp3.Interceptor
|
|
import okhttp3.Interceptor
|
|
@@ -153,53 +151,51 @@ open class WebDav(val path: String, val authorization: Authorization) {
|
|
|
private fun parseBody(s: String): List<WebDavFile> {
|
|
private fun parseBody(s: String): List<WebDavFile> {
|
|
|
val list = ArrayList<WebDavFile>()
|
|
val list = ArrayList<WebDavFile>()
|
|
|
val document = Jsoup.parse(s)
|
|
val document = Jsoup.parse(s)
|
|
|
- val elements = document.getElementsByTag("d:response")
|
|
|
|
|
- httpUrl?.let { urlStr ->
|
|
|
|
|
- val baseUrl = NetworkUtils.getBaseUrl(urlStr)
|
|
|
|
|
- for (element in elements) {
|
|
|
|
|
- //依然是优化支持 caddy 自建的 WebDav ,其目录后缀都为“/”, 所以删除“/”的判定,不然无法获取该目录项
|
|
|
|
|
- var href = URLDecoder.decode(element.getElementsByTag("d:href")[0].text(), "UTF-8")
|
|
|
|
|
- if (href.endsWith("/")) {
|
|
|
|
|
- href = href.removeSuffix("/")
|
|
|
|
|
- }
|
|
|
|
|
- val fileName = href.substring(href.lastIndexOf("/") + 1)
|
|
|
|
|
- val webDavFile: WebDav
|
|
|
|
|
- try {
|
|
|
|
|
- val urlName = href.ifEmpty {
|
|
|
|
|
- url.file.replace("/", "")
|
|
|
|
|
- }
|
|
|
|
|
- val contentType = element
|
|
|
|
|
- .getElementsByTag("d:getcontenttype")
|
|
|
|
|
- .firstOrNull()?.text().orEmpty()
|
|
|
|
|
- val resourceType = element
|
|
|
|
|
- .getElementsByTag("d:resourcetype")
|
|
|
|
|
- .firstOrNull()?.html()?.trim().orEmpty()
|
|
|
|
|
- val size = kotlin.runCatching {
|
|
|
|
|
- element.getElementsByTag("d:getcontentlength")
|
|
|
|
|
- .firstOrNull()?.text()?.toLong() ?: 0
|
|
|
|
|
- }.getOrDefault(0)
|
|
|
|
|
- val lastModify: Long = kotlin.runCatching {
|
|
|
|
|
- element.getElementsByTag("d:getlastmodified")
|
|
|
|
|
- .firstOrNull()?.text()?.let {
|
|
|
|
|
- LocalDateTime.parse(it, dateTimeFormatter)
|
|
|
|
|
- .toInstant(ZoneOffset.of("+8")).toEpochMilli()
|
|
|
|
|
- }
|
|
|
|
|
- }.getOrNull() ?: 0
|
|
|
|
|
- val fullURL = NetworkUtils.getAbsoluteURL(baseUrl, href)
|
|
|
|
|
- webDavFile = WebDavFile(
|
|
|
|
|
- fullURL,
|
|
|
|
|
- authorization,
|
|
|
|
|
- displayName = fileName,
|
|
|
|
|
- urlName = urlName,
|
|
|
|
|
- size = size,
|
|
|
|
|
- contentType = contentType,
|
|
|
|
|
- resourceType = resourceType,
|
|
|
|
|
- lastModify = lastModify
|
|
|
|
|
- )
|
|
|
|
|
- list.add(webDavFile)
|
|
|
|
|
- } catch (e: MalformedURLException) {
|
|
|
|
|
- e.printOnDebug()
|
|
|
|
|
|
|
+ val ns = document.findNSPrefix("DAV:")
|
|
|
|
|
+ val elements = document.findNS("response", ns)
|
|
|
|
|
+ val urlStr = httpUrl ?: return list
|
|
|
|
|
+ val baseUrl = NetworkUtils.getBaseUrl(urlStr)
|
|
|
|
|
+ for (element in elements) {
|
|
|
|
|
+ //依然是优化支持 caddy 自建的 WebDav ,其目录后缀都为“/”, 所以删除“/”的判定,不然无法获取该目录项
|
|
|
|
|
+ val href = URLDecoder.decode(element.findNS("href", ns)[0].text(), "UTF-8")
|
|
|
|
|
+ .removeSuffix("/")
|
|
|
|
|
+ val fileName = href.substringAfterLast("/")
|
|
|
|
|
+ val webDavFile: WebDav
|
|
|
|
|
+ try {
|
|
|
|
|
+ val urlName = href.ifEmpty {
|
|
|
|
|
+ url.file.replace("/", "")
|
|
|
}
|
|
}
|
|
|
|
|
+ val contentType = element
|
|
|
|
|
+ .findNS("getcontenttype", ns)
|
|
|
|
|
+ .firstOrNull()?.text().orEmpty()
|
|
|
|
|
+ val resourceType = element
|
|
|
|
|
+ .findNS("resourcetype", ns)
|
|
|
|
|
+ .firstOrNull()?.html()?.trim().orEmpty()
|
|
|
|
|
+ val size = kotlin.runCatching {
|
|
|
|
|
+ element.findNS("getcontentlength", ns)
|
|
|
|
|
+ .firstOrNull()?.text()?.toLong() ?: 0
|
|
|
|
|
+ }.getOrDefault(0)
|
|
|
|
|
+ val lastModify: Long = kotlin.runCatching {
|
|
|
|
|
+ element.findNS("getlastmodified", ns)
|
|
|
|
|
+ .firstOrNull()?.text()?.let {
|
|
|
|
|
+ LocalDateTime.parse(it, dateTimeFormatter)
|
|
|
|
|
+ .toInstant(ZoneOffset.of("+8")).toEpochMilli()
|
|
|
|
|
+ }
|
|
|
|
|
+ }.getOrNull() ?: 0
|
|
|
|
|
+ val fullURL = NetworkUtils.getAbsoluteURL(baseUrl, href)
|
|
|
|
|
+ webDavFile = WebDavFile(
|
|
|
|
|
+ fullURL,
|
|
|
|
|
+ authorization,
|
|
|
|
|
+ displayName = fileName,
|
|
|
|
|
+ urlName = urlName,
|
|
|
|
|
+ size = size,
|
|
|
|
|
+ contentType = contentType,
|
|
|
|
|
+ resourceType = resourceType,
|
|
|
|
|
+ lastModify = lastModify
|
|
|
|
|
+ )
|
|
|
|
|
+ list.add(webDavFile)
|
|
|
|
|
+ } catch (e: MalformedURLException) {
|
|
|
|
|
+ e.printOnDebug()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
return list
|
|
return list
|
|
@@ -380,7 +376,9 @@ open class WebDav(val path: String, val authorization: Authorization) {
|
|
|
val exception = document.getElementsByTag("s:exception").firstOrNull()?.text()
|
|
val exception = document.getElementsByTag("s:exception").firstOrNull()?.text()
|
|
|
val message = document.getElementsByTag("s:message").firstOrNull()?.text()
|
|
val message = document.getElementsByTag("s:message").firstOrNull()?.text()
|
|
|
if (exception == "ObjectNotFound") {
|
|
if (exception == "ObjectNotFound") {
|
|
|
- throw ObjectNotFoundException(message ?: "$path doesn't exist. code:${response.code}")
|
|
|
|
|
|
|
+ throw ObjectNotFoundException(
|
|
|
|
|
+ message ?: "$path doesn't exist. code:${response.code}"
|
|
|
|
|
+ )
|
|
|
}
|
|
}
|
|
|
throw WebDavException(message ?: "未知错误 code:${response.code}")
|
|
throw WebDavException(message ?: "未知错误 code:${response.code}")
|
|
|
}
|
|
}
|