From 406754370195358612e5eb0f823f91672c6cae74 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:56:32 +0800 Subject: [PATCH] Cleanup code --- .../com/hippo/ehviewer/cronet/CronetKt.kt | 34 ------------------- .../com/hippo/ehviewer/client/EhEngine.kt | 11 ++---- .../hippo/ehviewer/cronet/CronetExtensions.kt | 33 ++++++++++++++++++ .../com/hippo/ehviewer/cronet/CronetKt.kt | 33 ------------------ 4 files changed, 36 insertions(+), 75 deletions(-) create mode 100644 app/src/main/kotlin/com/hippo/ehviewer/cronet/CronetExtensions.kt diff --git a/app/src/gms/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt b/app/src/gms/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt index 32d95a3a4..477e9dac8 100644 --- a/app/src/gms/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt +++ b/app/src/gms/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt @@ -1,14 +1,10 @@ package com.hippo.ehviewer.cronet -import com.hippo.ehviewer.EhApplication import com.hippo.ehviewer.client.CHROME_ACCEPT import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE import com.hippo.ehviewer.client.CHROME_USER_AGENT import com.hippo.ehviewer.client.EhCookieStore -import eu.kanade.tachiyomi.util.system.logcat -import io.ktor.utils.io.pool.DirectByteBufferPool import java.nio.ByteBuffer -import java.nio.channels.FileChannel import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.coroutines.Continuation @@ -25,9 +21,6 @@ import org.chromium.net.UrlRequest import org.chromium.net.UrlResponseInfo import splitties.init.appCtx -private const val TAG = "CronetRequest" -val pool = DirectByteBufferPool(32) - val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply { enableBrotli(true) val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() } @@ -36,9 +29,6 @@ val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply { setUserAgent(CHROME_USER_AGENT) }.build() -val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService - -// TODO: Rewrite this to use android.net.http.HttpEngine and make it Android 14 only when released class CronetRequest { lateinit var consumer: (ByteBuffer) -> Unit lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit @@ -47,7 +37,6 @@ class CronetRequest { lateinit var readerCont: Continuation val callback = object : UrlRequest.Callback() { override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) { - logcat(tag = TAG) { "Redirected to $url" } req.followRedirect() } @@ -79,29 +68,6 @@ inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest. }.apply(conf).build() } -suspend inline fun CronetRequest.awaitBodyFully(crossinline callback: (ByteBuffer) -> Unit) { - val buffer = pool.borrow() - return try { - suspendCancellableCoroutine { cont -> - consumer = { - callback(it) - buffer.clear() - request.read(buffer) - } - onError = { readerCont.resumeWithException(it) } - readerCont = cont - request.read(buffer) - } - } finally { - pool.recycle(buffer) - } -} - -suspend inline fun CronetRequest.copyToChannel(chan: FileChannel, crossinline listener: ((Int) -> Unit) = {}) = awaitBodyFully { - val bytes = chan.write(it) - listener(bytes) -} - suspend inline fun CronetRequest.execute(crossinline callback: suspend CronetRequest.(UrlResponseInfo) -> R): R { contract { callsInPlace(callback, InvocationKind.EXACTLY_ONCE) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt index 41ad4c1b9..21c024a37 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt @@ -54,6 +54,7 @@ import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.StatusCodeException import com.hippo.ehviewer.util.isCronetSupported import io.ktor.utils.io.pool.DirectByteBufferPool +import io.ktor.utils.io.pool.useInstance import java.io.File import java.nio.ByteBuffer import kotlin.math.ceil @@ -121,28 +122,22 @@ val httpContentPool = DirectByteBufferPool(16, 0x20000) suspend inline fun fetchCompat(url: String, referer: String? = null, crossinline parser: (ByteBuffer) -> T): T { return if (isCronetSupported) { cronetRequest(url, referer).execute { - val buffer = httpContentPool.borrow() - try { + httpContentPool.useInstance { buffer -> awaitBodyFully { buffer.put(it) } buffer.flip() parser(buffer) - } finally { - httpContentPool.recycle(buffer) } } } else { ehRequest(url, referer).execute { - val buffer = httpContentPool.borrow() - try { + httpContentPool.useInstance { buffer -> while (true) { if (body.source().read(buffer) == -1) break } buffer.flip() parser(buffer) - } finally { - httpContentPool.recycle(buffer) } } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/cronet/CronetExtensions.kt b/app/src/main/kotlin/com/hippo/ehviewer/cronet/CronetExtensions.kt new file mode 100644 index 000000000..6932f7f7e --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/cronet/CronetExtensions.kt @@ -0,0 +1,33 @@ +package com.hippo.ehviewer.cronet + +import com.hippo.ehviewer.EhApplication +import io.ktor.utils.io.pool.DirectByteBufferPool +import io.ktor.utils.io.pool.useInstance +import java.nio.ByteBuffer +import java.nio.channels.FileChannel +import kotlin.coroutines.resumeWithException +import kotlinx.coroutines.suspendCancellableCoroutine + +val pool = DirectByteBufferPool(32) + +val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService + +suspend inline fun CronetRequest.awaitBodyFully(crossinline callback: (ByteBuffer) -> Unit) { + return pool.useInstance { buffer -> + suspendCancellableCoroutine { cont -> + consumer = { + callback(it) + buffer.clear() + request.read(buffer) + } + onError = { readerCont.resumeWithException(it) } + readerCont = cont + request.read(buffer) + } + } +} + +suspend inline fun CronetRequest.copyToChannel(chan: FileChannel, crossinline listener: ((Int) -> Unit) = {}) = awaitBodyFully { + val bytes = chan.write(it) + listener(bytes) +} diff --git a/app/src/oss/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt b/app/src/oss/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt index 4a69678eb..b23b364cb 100644 --- a/app/src/oss/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt +++ b/app/src/oss/kotlin/com/hippo/ehviewer/cronet/CronetKt.kt @@ -8,15 +8,11 @@ import android.net.http.UrlRequest import android.net.http.UrlResponseInfo import android.os.Build import androidx.annotation.RequiresExtension -import com.hippo.ehviewer.EhApplication import com.hippo.ehviewer.client.CHROME_ACCEPT import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE import com.hippo.ehviewer.client.CHROME_USER_AGENT import com.hippo.ehviewer.client.EhCookieStore -import eu.kanade.tachiyomi.util.system.logcat -import io.ktor.utils.io.pool.DirectByteBufferPool import java.nio.ByteBuffer -import java.nio.channels.FileChannel import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.coroutines.Continuation @@ -29,9 +25,6 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okio.Path.Companion.toOkioPath import splitties.init.appCtx -private const val TAG = "CronetRequest" -val pool = DirectByteBufferPool(32) - val cronetHttpClient: HttpEngine = HttpEngine.Builder(appCtx).apply { setEnableBrotli(true) val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() } @@ -40,8 +33,6 @@ val cronetHttpClient: HttpEngine = HttpEngine.Builder(appCtx).apply { setUserAgent(CHROME_USER_AGENT) }.build() -val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService - class CronetRequest { lateinit var consumer: (ByteBuffer) -> Unit lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit @@ -50,7 +41,6 @@ class CronetRequest { lateinit var readerCont: Continuation val callback = object : UrlRequest.Callback { override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) { - logcat(tag = TAG) { "Redirected to $url" } req.followRedirect() } @@ -86,29 +76,6 @@ inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest. }.apply(conf).build() } -suspend inline fun CronetRequest.awaitBodyFully(crossinline callback: (ByteBuffer) -> Unit) { - val buffer = pool.borrow() - return try { - suspendCancellableCoroutine { cont -> - consumer = { - callback(it) - buffer.clear() - request.read(buffer) - } - onError = { readerCont.resumeWithException(it) } - readerCont = cont - request.read(buffer) - } - } finally { - pool.recycle(buffer) - } -} - -suspend inline fun CronetRequest.copyToChannel(chan: FileChannel, crossinline listener: ((Int) -> Unit) = {}) = awaitBodyFully { - val bytes = chan.write(it) - listener(bytes) -} - suspend inline fun CronetRequest.execute(crossinline callback: suspend CronetRequest.(UrlResponseInfo) -> R): R { contract { callsInPlace(callback, InvocationKind.EXACTLY_ONCE)