diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bfdb0c267..5a3524e6d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -191,7 +191,7 @@ dependencies { // implementation 'io.coil-kt:coil:2.2.2' implementation("com.github.Ehviewer-Overhauled.coil:coil-compose:d65881d") - implementation("io.ktor:ktor-client-okhttp:2.2.3") + implementation("io.ktor:ktor-client-cio:2.2.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.5.0-RC") implementation("org.jsoup:jsoup:1.15.3") diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt index 56b7dc09d..a2ba1c72c 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt @@ -56,7 +56,8 @@ import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.lang.launchIO import io.ktor.client.HttpClient -import io.ktor.client.engine.okhttp.OkHttp +import io.ktor.client.engine.cio.CIO +import io.ktor.client.plugins.cookies.HttpCookies import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -282,6 +283,25 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor @JvmStatic val ehProxySelector by lazy { EhProxySelector() } + private val trustManager by lazy { + try { + val trustManagerFactory = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm() + ) + trustManagerFactory.init(null as KeyStore?) + val trustManagers = trustManagerFactory.trustManagers + check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) { + "Unexpected default trust managers:" + Arrays.toString( + trustManagers + ) + } + trustManagers[0] as X509TrustManager + } catch (e: Exception) { + e.printStackTrace() + EhX509TrustManager + } + } + @JvmStatic val okHttpClient by lazy { val builder = OkHttpClient.Builder() @@ -290,24 +310,6 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor .proxySelector(ehProxySelector) if (Settings.getDF()) { - var trustManager: X509TrustManager - try { - val trustManagerFactory = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm() - ) - trustManagerFactory.init(null as KeyStore?) - val trustManagers = trustManagerFactory.trustManagers - check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) { - "Unexpected default trust managers:" + Arrays.toString( - trustManagers - ) - } - trustManager = trustManagers[0] as X509TrustManager - } catch (e: Exception) { - e.printStackTrace() - trustManager = EhX509TrustManager - } - builder.sslSocketFactory(EhSSLSocketFactory, trustManager) builder.proxy(Proxy.NO_PROXY) } @@ -315,9 +317,15 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor } val ktorClient by lazy { - HttpClient(OkHttp) { + HttpClient(CIO) { engine { - preconfigured = okHttpClient + https { + serverName = "0.0.0.0".takeIf { Settings.getDF() } + trustManager = EhX509TrustManager + } + } + install(HttpCookies) { + storage = EhCookieStore } } } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.kt b/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.kt index 549f9c9a5..ba9a77b89 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.kt @@ -18,14 +18,21 @@ package com.hippo.ehviewer.client import com.hippo.ehviewer.EhApplication import com.hippo.network.CookieDatabase import com.hippo.network.CookieSet +import io.ktor.client.plugins.cookies.CookiesStorage +import io.ktor.http.Url import okhttp3.Cookie import okhttp3.CookieJar import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl import java.util.Collections import java.util.regex.Pattern +import kotlin.collections.component1 +import kotlin.collections.component2 +import kotlin.collections.set -object EhCookieStore : CookieJar { +typealias KtorCookie = io.ktor.http.Cookie + +object EhCookieStore : CookieJar, CookiesStorage { private val db: CookieDatabase = CookieDatabase(EhApplication.application, "okhttp3-cookie.db") private val map: MutableMap = db.allCookies @@ -176,9 +183,19 @@ object EhCookieStore : CookieJar { db.clear() } - @Synchronized - fun close() { - db.close() + override suspend fun addCookie(requestUrl: Url, cookie: io.ktor.http.Cookie) {} + + // This should never be closed + override fun close() {} + + private val okhttpCookieToKtorCookieMap = hashMapOf() + override suspend fun get(requestUrl: Url): List { + return loadForRequest(requestUrl.toString().toHttpUrl()).map { + okhttpCookieToKtorCookieMap[it] ?: KtorCookie( + it.name, + it.value + ).apply { okhttpCookieToKtorCookieMap[it] = this } + } } override fun saveFromResponse(url: HttpUrl, cookies: List) {