This commit is contained in:
Horis
2023-04-17 14:57:58 +08:00
parent 21c677cb3a
commit 21f942fcb9
3 changed files with 26 additions and 24 deletions
@@ -19,6 +19,7 @@ import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.ensureActive import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import splitties.init.appCtx import splitties.init.appCtx
import java.io.BufferedOutputStream
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
@@ -153,9 +154,11 @@ object Backup {
path.isNullOrBlank() -> { path.isNullOrBlank() -> {
copyBackup(context.getExternalFilesDir(null)!!, "backup.zip") copyBackup(context.getExternalFilesDir(null)!!, "backup.zip")
} }
path.isContentScheme() -> { path.isContentScheme() -> {
copyBackup(context, Uri.parse(path), "backup.zip") copyBackup(context, Uri.parse(path), "backup.zip")
} }
else -> { else -> {
copyBackup(File(path), "backup.zip") copyBackup(File(path), "backup.zip")
} }
@@ -168,8 +171,10 @@ object Backup {
private fun writeListToJson(list: List<Any>, fileName: String, path: String) { private fun writeListToJson(list: List<Any>, fileName: String, path: String) {
if (list.isNotEmpty()) { if (list.isNotEmpty()) {
val file = FileUtils.createFileIfNotExist(path + File.separator + fileName) val file = FileUtils.createFileIfNotExist(path + File.separator + fileName)
FileOutputStream(file).use { FileOutputStream(file).use { fos ->
GSON.writeToOutputStream(it, list) BufferedOutputStream(fos, 64 * 1024).use {
GSON.writeToOutputStream(it, list)
}
} }
} }
} }
@@ -166,7 +166,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
loadChapter(it, scope) loadChapter(it, scope)
} }
}.onError { }.onError {
AppLog.put("获取数据信息失败\n${it.localizedMessage}", it) AppLog.put("获取书籍信息失败\n${it.localizedMessage}", it)
context.toastOnUi(R.string.error_get_book_info) context.toastOnUi(R.string.error_get_book_info)
} }
} ?: let { } ?: let {
@@ -305,7 +305,6 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
} }
} }
@Suppress("BlockingMethodInNonBlockingContext")
fun importArchiveBook( fun importArchiveBook(
archiveFileUri: Uri, archiveFileUri: Uri,
archiveEntryName: String, archiveEntryName: String,
@@ -7,10 +7,10 @@ import io.legado.app.api.controller.BookController
import io.legado.app.api.controller.BookSourceController import io.legado.app.api.controller.BookSourceController
import io.legado.app.api.controller.ReplaceRuleController import io.legado.app.api.controller.ReplaceRuleController
import io.legado.app.api.controller.RssSourceController import io.legado.app.api.controller.RssSourceController
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.service.WebService import io.legado.app.service.WebService
import io.legado.app.utils.* import io.legado.app.utils.*
import io.legado.app.web.utils.AssetsWeb import io.legado.app.web.utils.AssetsWeb
import splitties.init.appCtx
import java.io.* import java.io.*
class HttpServer(port: Int) : NanoHTTPD(port) { class HttpServer(port: Int) : NanoHTTPD(port) {
@@ -33,6 +33,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
//response.addHeader("Access-Control-Max-Age", "3600"); //response.addHeader("Access-Control-Max-Age", "3600");
return response return response
} }
Method.POST -> { Method.POST -> {
val files = HashMap<String, String>() val files = HashMap<String, String>()
session.parseBody(files) session.parseBody(files)
@@ -56,6 +57,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
else -> null else -> null
} }
} }
Method.GET -> { Method.GET -> {
val parameters = session.parameters val parameters = session.parameters
@@ -75,6 +77,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
else -> null else -> null
} }
} }
else -> Unit else -> Unit
} }
@@ -97,29 +100,24 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
byteArray.size.toLong() byteArray.size.toLong()
) )
} else { } else {
try { val data = returnData.data
val data = returnData.data if (data is List<*> && data.size > 1000) {
if (data is List<*> && data.size > 3000) { val pis = PipedInputStream(1024 * 1024)
throw OutOfMemoryError() Coroutine.async {
@Suppress("BlockingMethodInNonBlockingContext")
PipedOutputStream(pis).use { out ->
BufferedWriter(OutputStreamWriter(out, "UTF-8")).use {
GSON.toJson(returnData, it)
}
}
} }
newFixedLengthResponse(GSON.toJson(returnData)) newChunkedResponse(
} catch (e: OutOfMemoryError) {
val path = FileUtils.getPath(
appCtx.externalFiles,
"book_cache",
"bookSources.json"
)
val file = FileUtils.createFileIfNotExist(path)
BufferedWriter(FileWriter(file), 128 * 1024).use {
GSON.toJson(returnData, it)
}
val fis = FileInputStream(file)
newFixedLengthResponse(
Response.Status.OK, Response.Status.OK,
"application/json", "application/json",
fis, pis
fis.available().toLong()
) )
} else {
newFixedLengthResponse(GSON.toJson(returnData))
} }
} }
response.addHeader("Access-Control-Allow-Methods", "GET, POST") response.addHeader("Access-Control-Allow-Methods", "GET, POST")