From ccac3475198fae871349baff513bf996f8631681 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 19 Jun 2023 22:18:47 +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 --- .../io/legado/app/help/http/OkHttpUtils.kt | 36 +++++++++++-------- .../association/ImportBookSourceViewModel.kt | 3 +- .../association/ImportRssSourceViewModel.kt | 3 +- .../io/legado/app/utils/compress/ZipUtils.kt | 5 +-- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt index 71e2fd3f8..b4ead2bb5 100644 --- a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt +++ b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt @@ -77,25 +77,27 @@ suspend fun Call.await(): Response = suspendCancellableCoroutine { block -> } fun ResponseBody.text(encode: String? = null): String { - val responseBytes = Utf8BomUtils.removeUTF8BOM(bytes()) - var charsetName: String? = encode + return unCompress { + val responseBytes = Utf8BomUtils.removeUTF8BOM(it.readBytes()) + var charsetName: String? = encode - charsetName?.let { - return String(responseBytes, Charset.forName(charsetName)) + charsetName?.let { + return@unCompress String(responseBytes, Charset.forName(charsetName)) + } + + //根据http头判断 + contentType()?.charset()?.let { charset -> + return@unCompress String(responseBytes, charset) + } + + //根据内容判断 + charsetName = EncodingDetect.getHtmlEncode(responseBytes) + return@unCompress String(responseBytes, Charset.forName(charsetName)) } - - //根据http头判断 - contentType()?.charset()?.let { - return String(responseBytes, it) - } - - //根据内容判断 - charsetName = EncodingDetect.getHtmlEncode(responseBytes) - return String(responseBytes, Charset.forName(charsetName)) } -fun ResponseBody.unCompress(success: (inputStream: InputStream) -> Unit) { - if (contentType() == "application/zip".toMediaType()) { +fun ResponseBody.unCompress(success: (inputStream: InputStream) -> T): T { + return if (contentType() == "application/zip".toMediaType()) { byteStream().use { byteStream -> ZipInputStream(byteStream).use { it.nextEntry @@ -152,18 +154,22 @@ fun Request.Builder.postMultipart(type: String?, form: Map) { is File -> { file.asRequestBody(mediaType) } + is ByteArray -> { file.toRequestBody(mediaType) } + is String -> { file.toRequestBody(mediaType) } + else -> { GSON.toJson(file).toRequestBody(mediaType) } } multipartBody.addFormDataPart(it.key, fileName, requestBody) } + else -> multipartBody.addFormDataPart(it.key, it.value.toString()) } } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt index e3f7a2710..ca62fc15b 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt @@ -16,6 +16,7 @@ import io.legado.app.help.book.ContentProcessor import io.legado.app.help.config.AppConfig import io.legado.app.help.http.newCallResponseBody import io.legado.app.help.http.okHttpClient +import io.legado.app.help.http.unCompress import io.legado.app.help.source.SourceHelp import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray @@ -187,7 +188,7 @@ class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) { } else { url(url) } - }.byteStream().use { + }.unCompress { GSON.fromJsonArray(it).getOrThrow().let { list -> val source = list.firstOrNull() ?: return@let if (source.bookSourceUrl.isEmpty()) { diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt index 58904be97..8490d10c4 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt @@ -14,6 +14,7 @@ import io.legado.app.exception.NoStackTraceException import io.legado.app.help.config.AppConfig import io.legado.app.help.http.newCallResponseBody import io.legado.app.help.http.okHttpClient +import io.legado.app.help.http.unCompress import io.legado.app.help.source.SourceHelp import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray @@ -148,7 +149,7 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) { } else { url(url) } - }.byteStream().use { body -> + }.unCompress { body -> val items: List> = jsonPath.parse(body).read("$") for (item in items) { if (!item.containsKey("sourceUrl")) { diff --git a/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt b/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt index 53fc1a334..3bddccc39 100644 --- a/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt @@ -33,6 +33,7 @@ object ZipUtils { zipOutputStream.putNextEntry(ZipEntry(fileName)) zipOutputStream.write(byteArray) zipOutputStream.closeEntry() + zipOutputStream.finish() return zipOutputStream.use { byteOut.use { byteOut.toByteArray() @@ -183,11 +184,11 @@ object ZipUtils { } } } else { - BufferedInputStream(FileInputStream(srcFile)).use { `is` -> + BufferedInputStream(FileInputStream(srcFile)).use { val entry = ZipEntry(rootPath1) entry.comment = comment zos.putNextEntry(entry) - zos.write(`is`.readBytes()) + it.copyTo(zos) zos.closeEntry() } }