From 30f97c5c821778459c4d1ff5f01affae555ae9b7 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 13 Sep 2025 10:06:42 +0300 Subject: [PATCH] Improve OkHttp coroutines integration --- .../parsers/util/ContinuationCallCallback.kt | 40 +++++++++---------- .../koitharu/kotatsu/parsers/util/OkHttp.kt | 2 +- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/ContinuationCallCallback.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/ContinuationCallCallback.kt index 599dba87..c2452144 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/ContinuationCallCallback.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/ContinuationCallCallback.kt @@ -5,32 +5,30 @@ import kotlinx.coroutines.CompletionHandler import okhttp3.Call import okhttp3.Callback import okhttp3.Response +import okhttp3.internal.closeQuietly import java.io.IOException -import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException internal class ContinuationCallCallback( - private val call: Call, - private val continuation: CancellableContinuation, + private val call: Call, + private val continuation: CancellableContinuation, ) : Callback, CompletionHandler { - override fun onResponse(call: Call, response: Response) { - if (continuation.isActive) { - continuation.resume(response) - } - } + override fun onResponse(call: Call, response: Response) { + continuation.resume(response) { _, value, _ -> + value.closeQuietly() + } + } - override fun onFailure(call: Call, e: IOException) { - if (!call.isCanceled() && continuation.isActive) { - continuation.resumeWithException(e) - } - } + override fun onFailure(call: Call, e: IOException) { + continuation.resumeWithException(e) + } - override fun invoke(cause: Throwable?) { - runCatching { - call.cancel() - }.onFailure { e -> - cause?.addSuppressed(e) - } - } -} \ No newline at end of file + override fun invoke(cause: Throwable?) { + runCatching { + call.cancel() + }.onFailure { e -> + cause?.addSuppressed(e) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt index 88a6e876..85d5be4f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/OkHttp.kt @@ -10,8 +10,8 @@ import kotlin.contracts.contract public suspend fun Call.await(): Response = suspendCancellableCoroutine { continuation -> val callback = ContinuationCallCallback(this, continuation) - enqueue(callback) continuation.invokeOnCancellation(callback) + enqueue(callback) } public val Response.mimeType: String?