Эх сурвалжийг харах

Clean up OkHttp methods and parse from Okio directly (#8238)

stevenyomi 2 жил өмнө
parent
commit
2d19729869

+ 1 - 6
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt

@@ -1,17 +1,12 @@
 package eu.kanade.tachiyomi.data.track.myanimelist
 
 import eu.kanade.tachiyomi.network.parseAs
-import kotlinx.serialization.json.Json
 import okhttp3.Interceptor
 import okhttp3.Response
-import okhttp3.internal.closeQuietly
-import uy.kohesive.injekt.injectLazy
 import java.io.IOException
 
 class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var token: String?) : Interceptor {
 
-    private val json: Json by injectLazy()
-
     private var oauth: OAuth? = null
 
     override fun intercept(chain: Interceptor.Chain): Response {
@@ -31,7 +26,7 @@ class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var t
                 if (oauthResponse.isSuccessful) {
                     oauthResponse.parseAs<OAuth>()
                 } else {
-                    oauthResponse.closeQuietly()
+                    oauthResponse.close()
                     null
                 }
             }

+ 1 - 0
core/build.gradle.kts

@@ -37,6 +37,7 @@ dependencies {
 
     api(kotlinx.coroutines.core)
     api(kotlinx.serialization.json)
+    api(kotlinx.serialization.json.okio)
 
     api(libs.injekt.core)
 

+ 17 - 9
core/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt

@@ -2,23 +2,27 @@ package eu.kanade.tachiyomi.network
 
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.suspendCancellableCoroutine
-import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.ExperimentalSerializationApi
+import kotlinx.serialization.KSerializer
 import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.okio.decodeFromBufferedSource
+import kotlinx.serialization.serializer
 import okhttp3.Call
 import okhttp3.Callback
 import okhttp3.MediaType.Companion.toMediaType
 import okhttp3.OkHttpClient
 import okhttp3.Request
 import okhttp3.Response
-import okhttp3.internal.closeQuietly
 import rx.Observable
 import rx.Producer
 import rx.Subscription
 import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.fullType
+import uy.kohesive.injekt.api.get
 import java.io.IOException
 import java.util.concurrent.atomic.AtomicBoolean
 import kotlin.coroutines.resumeWithException
+import kotlin.reflect.KType
+import kotlin.reflect.typeOf
 
 val jsonMime = "application/json; charset=utf-8".toMediaType()
 
@@ -72,7 +76,7 @@ suspend fun Call.await(): Response {
                     }
 
                     continuation.resume(response) {
-                        response.body.closeQuietly()
+                        response.body.close()
                     }
                 }
 
@@ -118,11 +122,15 @@ fun OkHttpClient.newCachelessCallWithProgress(request: Request, listener: Progre
 }
 
 inline fun <reified T> Response.parseAs(): T {
-    // Avoiding Injekt.get<Json>() due to compiler issues
-    val json = Injekt.getInstance<Json>(fullType<Json>().type)
-    this.use {
-        val responseBody = it.body.string()
-        return json.decodeFromString(responseBody)
+    return internalParseAs(this, typeOf<T>())
+}
+
+@Suppress("UNCHECKED_CAST")
+@OptIn(ExperimentalSerializationApi::class)
+fun <T> internalParseAs(response: Response, type: KType): T {
+    val deserializer = serializer(type) as KSerializer<T>
+    return response.body.source().use {
+        Injekt.get<Json>().decodeFromBufferedSource(deserializer, it)
     }
 }
 

+ 2 - 1
gradle/kotlinx.versions.toml

@@ -12,6 +12,7 @@ coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", ve
 coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines_version" }
 
 serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization_version" }
+serialization-json-okio = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-okio", version.ref = "serialization_version" }
 serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "serialization_version" }
 serialization-gradle = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin_version" }
 serialization-xml-core = { module = "io.github.pdvrieze.xmlutil:core-android", version.ref = "xml_serialization_version" }
@@ -19,7 +20,7 @@ serialization-xml = { module = "io.github.pdvrieze.xmlutil:serialization-android
 
 [bundles]
 coroutines = ["coroutines-core", "coroutines-android"]
-serialization = ["serialization-json", "serialization-protobuf", "serialization-xml-core", "serialization-xml"]
+serialization = ["serialization-json", "serialization-json-okio", "serialization-protobuf", "serialization-xml-core", "serialization-xml"]
 
 [plugins]
 android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin_version" }