Remove embedded Cronet library
This commit is contained in:
1 parent
4a0df07805
commit
9c5eddb903
6 files changed
+32
-17
No files matched your search
@@ -250,8 +250,6 @@ dependencies {
|
|||||||
implementation("io.ktor:ktor-io-jvm:$ktor")
|
implementation("io.ktor:ktor-io-jvm:$ktor")
|
||||||
implementation("io.ktor:ktor-utils-jvm:$ktor")
|
implementation("io.ktor:ktor-utils-jvm:$ktor")
|
||||||
|
|
||||||
implementation("org.chromium.net:cronet-embedded:113.5672.61")
|
|
||||||
|
|
||||||
val serialization = "1.5.1"
|
val serialization = "1.5.1"
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:$serialization")
|
implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:$serialization")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization")
|
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization")
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
@file:Suppress("BlockingMethodInNonBlockingContext")
|
@file:Suppress("BlockingMethodInNonBlockingContext")
|
||||||
|
@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7)
|
||||||
|
|
||||||
package com.hippo.ehviewer.coil
|
package com.hippo.ehviewer.coil
|
||||||
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import android.webkit.MimeTypeMap
|
import android.webkit.MimeTypeMap
|
||||||
|
import androidx.annotation.RequiresExtension
|
||||||
import coil.ComponentRegistry
|
import coil.ComponentRegistry
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import coil.decode.DataSource
|
import coil.decode.DataSource
|
||||||
@@ -27,7 +30,7 @@ class CronetHttpUriFetcher(private val data: String, private val options: Option
|
|||||||
val diskCache = requireNotNull(imageLoader.diskCache)
|
val diskCache = requireNotNull(imageLoader.diskCache)
|
||||||
val snapshot = diskCache.openSnapshot(diskCacheKey) ?: run {
|
val snapshot = diskCache.openSnapshot(diskCacheKey) ?: run {
|
||||||
val success = cronetRequest(data) {
|
val success = cronetRequest(data) {
|
||||||
disableCache()
|
setCacheDisabled(true)
|
||||||
}.execute {
|
}.execute {
|
||||||
diskCache.suspendEdit(diskCacheKey) {
|
diskCache.suspendEdit(diskCacheKey) {
|
||||||
RandomAccessFile(data.toFile(), "rw").use {
|
RandomAccessFile(data.toFile(), "rw").use {
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
|
@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7)
|
||||||
|
|
||||||
package com.hippo.ehviewer.cronet
|
package com.hippo.ehviewer.cronet
|
||||||
|
|
||||||
|
import android.net.http.HttpEngine
|
||||||
|
import android.net.http.HttpException
|
||||||
|
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.EhApplication
|
||||||
import com.hippo.ehviewer.client.CHROME_ACCEPT
|
import com.hippo.ehviewer.client.CHROME_ACCEPT
|
||||||
import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE
|
import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE
|
||||||
@@ -12,10 +20,6 @@ import kotlinx.coroutines.launch
|
|||||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okio.Path.Companion.toOkioPath
|
import okio.Path.Companion.toOkioPath
|
||||||
import org.chromium.net.CronetEngine
|
|
||||||
import org.chromium.net.CronetException
|
|
||||||
import org.chromium.net.UrlRequest
|
|
||||||
import org.chromium.net.UrlResponseInfo
|
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
import java.nio.channels.FileChannel
|
import java.nio.channels.FileChannel
|
||||||
@@ -28,24 +32,23 @@ import kotlin.coroutines.resumeWithException
|
|||||||
private const val TAG = "CronetRequest"
|
private const val TAG = "CronetRequest"
|
||||||
val pool = DirectByteBufferPool(32)
|
val pool = DirectByteBufferPool(32)
|
||||||
|
|
||||||
val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply {
|
val cronetHttpClient: HttpEngine = HttpEngine.Builder(appCtx).apply {
|
||||||
enableBrotli(true)
|
setEnableBrotli(true)
|
||||||
val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() }
|
val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() }
|
||||||
setStoragePath(cache.absolutePath)
|
setStoragePath(cache.absolutePath)
|
||||||
enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024)
|
setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024)
|
||||||
setUserAgent(CHROME_USER_AGENT)
|
setUserAgent(CHROME_USER_AGENT)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService
|
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 {
|
class CronetRequest {
|
||||||
lateinit var consumer: (ByteBuffer) -> Unit
|
lateinit var consumer: (ByteBuffer) -> Unit
|
||||||
lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit
|
lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit
|
||||||
lateinit var request: UrlRequest
|
lateinit var request: UrlRequest
|
||||||
lateinit var onError: (Throwable) -> Unit
|
lateinit var onError: (Throwable) -> Unit
|
||||||
lateinit var readerCont: Continuation<Unit>
|
lateinit var readerCont: Continuation<Unit>
|
||||||
val callback = object : UrlRequest.Callback() {
|
val callback = object : UrlRequest.Callback {
|
||||||
override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) {
|
override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) {
|
||||||
logcat(tag = TAG) { "Redirected to $url" }
|
logcat(tag = TAG) { "Redirected to $url" }
|
||||||
req.followRedirect()
|
req.followRedirect()
|
||||||
@@ -64,14 +67,18 @@ class CronetRequest {
|
|||||||
readerCont.resume(Unit)
|
readerCont.resume(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: CronetException) {
|
override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: HttpException) {
|
||||||
onError(e)
|
onError(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCanceled(req: UrlRequest, info: UrlResponseInfo?) {
|
||||||
|
// No-op
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest.Builder.() -> Unit = {}) = CronetRequest().apply {
|
inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest.Builder.() -> Unit = {}) = CronetRequest().apply {
|
||||||
request = cronetHttpClient.newUrlRequestBuilder(url, callback, cronetHttpClientExecutor).apply {
|
request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).apply {
|
||||||
addHeader("Cookie", EhCookieStore.getCookieHeader(url.toHttpUrl()))
|
addHeader("Cookie", EhCookieStore.getCookieHeader(url.toHttpUrl()))
|
||||||
addHeader("Accept", CHROME_ACCEPT)
|
addHeader("Accept", CHROME_ACCEPT)
|
||||||
addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE)
|
addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE)
|
||||||
|
|||||||
@@ -135,9 +135,9 @@ class SpiderDen(mGalleryInfo: GalleryInfo) {
|
|||||||
): Boolean {
|
): Boolean {
|
||||||
return if (isCronetSupported) {
|
return if (isCronetSupported) {
|
||||||
cronetRequest(url, referer) {
|
cronetRequest(url, referer) {
|
||||||
disableCache()
|
setCacheDisabled(true)
|
||||||
}.execute { info ->
|
}.execute { info ->
|
||||||
val headers = info.allHeaders
|
val headers = info.headers.asMap
|
||||||
val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg"
|
val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg"
|
||||||
val length = headers["Content-Length"]!!.first().toLong()
|
val length = headers["Content-Length"]!!.first().toLong()
|
||||||
saveResponseMeta(index, type, length) { file ->
|
saveResponseMeta(index, type, length) { file ->
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
package com.hippo.ehviewer.util
|
package com.hippo.ehviewer.util
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.annotation.ChecksSdkIntAtLeast
|
||||||
|
|
||||||
|
@get:ChecksSdkIntAtLeast(Build.VERSION_CODES.S, extension = 7)
|
||||||
val isCronetSupported: Boolean
|
val isCronetSupported: Boolean
|
||||||
get() = isAtLeastQ
|
get() = isAtLeastSExtension7
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
package com.hippo.ehviewer.util
|
package com.hippo.ehviewer.util
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.os.ext.SdkExtensions
|
||||||
|
|
||||||
val isAtLeastQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
val isAtLeastQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||||
|
val isAtLeastR = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
|
||||||
|
val isAtLeastSExtension7 = isAtLeastR && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7
|
||||||
Reference in new issue
Block a user