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

(cherry picked from commit 2d19729869)

# Conflicts:
#	core/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt
This commit is contained in:
stevenyomi
2022-10-19 00:09:23 +08:00
committed by Jobobby04
parent a7c45ab61e
commit a31e8282cb
4 changed files with 22 additions and 17 deletions
@@ -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()
}
}
@@ -117,12 +121,16 @@ fun OkHttpClient.newCachelessCallWithProgress(request: Request, listener: Progre
return progressClient.newCall(request)
}
inline fun <reified T> Response.parseAs(/* SY --> */ json: Json = Injekt.getInstance(fullType<Json>().type) /* SY <-- */): 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)
inline fun <reified T> Response.parseAs(/* SY --> */json: Json = Injekt.get()/* SY <-- */): T {
return internalParseAs(this, typeOf<T>(), /* SY --> */ json /* SY <-- */)
}
@Suppress("UNCHECKED_CAST")
@OptIn(ExperimentalSerializationApi::class)
fun <T> internalParseAs(response: Response, type: KType, /* SY --> */ json: Json /* SY <-- */): T {
val deserializer = serializer(type) as KSerializer<T>
return response.body.source().use {
json.decodeFromBufferedSource(deserializer, it)
}
}