OkHttp Call: split await() and awaitSuccess() (#8980)
(cherry picked from commit 448702e5beedcd0918c504da34a0feda20ee2817)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package exh.md.handlers
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.jsonArray
|
||||
@@ -24,7 +24,7 @@ class AzukiHandler(currentClient: OkHttpClient, userAgent: String) {
|
||||
suspend fun fetchPageList(externalUrl: String): List<Page> {
|
||||
val chapterId = externalUrl.substringAfterLast("/").substringBefore("?")
|
||||
val request = pageListRequest(chapterId)
|
||||
return pageListParse(client.newCall(request).await())
|
||||
return pageListParse(client.newCall(request).awaitSuccess())
|
||||
}
|
||||
|
||||
private fun pageListRequest(chapterId: String): Request {
|
||||
|
||||
@@ -2,7 +2,7 @@ package exh.md.handlers
|
||||
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
@@ -92,7 +92,7 @@ class BilibiliHandler(currentClient: OkHttpClient) {
|
||||
}
|
||||
|
||||
suspend fun getChapterList(mangaUrl: String): List<SChapter> {
|
||||
val response = client.newCall(mangaDetailsApiRequest(mangaUrl)).await()
|
||||
val response = client.newCall(mangaDetailsApiRequest(mangaUrl)).awaitSuccess()
|
||||
return chapterListParse(response)
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ class BilibiliHandler(currentClient: OkHttpClient) {
|
||||
)
|
||||
|
||||
private suspend fun fetchPageList(chapterUrl: String): List<Page> {
|
||||
val response = client.newCall(pageListRequest(chapterUrl)).await()
|
||||
val response = client.newCall(pageListRequest(chapterUrl)).awaitSuccess()
|
||||
return pageListParse(response)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package exh.md.handlers
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
import kotlinx.serialization.json.Json
|
||||
@@ -29,13 +29,13 @@ class ComikeyHandler(cloudflareClient: OkHttpClient, userAgent: String) {
|
||||
suspend fun fetchPageList(externalUrl: String): List<Page> {
|
||||
val httpUrl = externalUrl.toHttpUrl()
|
||||
val mangaId = getMangaId(httpUrl.pathSegments[1])
|
||||
val response = client.newCall(pageListRequest(mangaId, httpUrl.pathSegments[2])).await()
|
||||
val response = client.newCall(pageListRequest(mangaId, httpUrl.pathSegments[2])).awaitSuccess()
|
||||
val request = getActualPageList(response) ?: return listOf(Page(0, urlForbidden, urlForbidden))
|
||||
return pageListParse(client.newCall(request).await())
|
||||
return pageListParse(client.newCall(request).awaitSuccess())
|
||||
}
|
||||
|
||||
suspend fun getMangaId(mangaUrl: String): Int {
|
||||
val response = client.newCall(GET("$baseUrl/read/$mangaUrl")).await()
|
||||
val response = client.newCall(GET("$baseUrl/read/$mangaUrl")).awaitSuccess()
|
||||
val url = response.asJsoup().selectFirst("meta[property=og:url]")!!.attr("content")
|
||||
return url.trimEnd('/').substringAfterLast('/').toInt()
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package exh.md.handlers
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.jsonArray
|
||||
@@ -22,7 +22,7 @@ class MangaHotHandler(currentClient: OkHttpClient, userAgent: String) {
|
||||
|
||||
suspend fun fetchPageList(externalUrl: String): List<Page> {
|
||||
val request = GET(externalUrl.substringBefore("?").replace(baseUrl, apiUrl).replace("viewer", "v1/works/storyDetail"), headers)
|
||||
return pageListParse(client.newCall(request).await())
|
||||
return pageListParse(client.newCall(request).awaitSuccess())
|
||||
}
|
||||
|
||||
fun pageListParse(response: Response): List<Page> {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package exh.md.handlers
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import exh.md.dto.MangaPlusResponse
|
||||
import kotlinx.serialization.decodeFromByteArray
|
||||
@@ -28,7 +28,7 @@ class MangaPlusHandler(currentClient: OkHttpClient) {
|
||||
.build()
|
||||
|
||||
suspend fun fetchPageList(chapterId: String): List<Page> {
|
||||
val response = client.newCall(pageListRequest(chapterId.substringAfterLast("/"))).await()
|
||||
val response = client.newCall(pageListRequest(chapterId.substringAfterLast("/"))).awaitSuccess()
|
||||
return pageListParse(response)
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import eu.kanade.domain.track.service.TrackPreferences
|
||||
import eu.kanade.tachiyomi.data.track.mdlist.MdList
|
||||
import eu.kanade.tachiyomi.data.track.myanimelist.OAuth
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import eu.kanade.tachiyomi.util.system.logcat
|
||||
import exh.md.utils.MdApi
|
||||
@@ -35,7 +35,7 @@ class MangaDexLoginHelper(
|
||||
.build()
|
||||
|
||||
val error = kotlin.runCatching {
|
||||
val data = client.newCall(POST(MdApi.baseAuthUrl + MdApi.token, body = loginFormBody)).await().parseAs<OAuth>()
|
||||
val data = client.newCall(POST(MdApi.baseAuthUrl + MdApi.token, body = loginFormBody)).awaitSuccess().parseAs<OAuth>()
|
||||
mangaDexAuthInterceptor.setAuth(data)
|
||||
}.exceptionOrNull()
|
||||
|
||||
@@ -72,7 +72,7 @@ class MangaDexLoginHelper(
|
||||
.build(),
|
||||
body = formBody,
|
||||
),
|
||||
).await()
|
||||
).awaitSuccess()
|
||||
mdList.logout()
|
||||
}.exceptionOrNull()
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package exh.md.service
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import exh.md.dto.MangaListDto
|
||||
import exh.md.dto.RatingDto
|
||||
@@ -32,7 +32,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun readingStatusForManga(mangaId: String): ReadingStatusDto {
|
||||
@@ -42,7 +42,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun readChaptersForManga(mangaId: String): ReadChapterDto {
|
||||
@@ -52,7 +52,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun updateReadingStatusForManga(
|
||||
@@ -66,7 +66,7 @@ class MangaDexAuthService(
|
||||
body = MdUtil.encodeToBody(readingStatusDto),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun readingStatusAllManga(): ReadingStatusMapDto {
|
||||
@@ -76,7 +76,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun readingStatusByType(status: String): ReadingStatusMapDto {
|
||||
@@ -86,7 +86,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun markChapterRead(chapterId: String): ResultDto {
|
||||
@@ -96,7 +96,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun markChapterUnRead(chapterId: String): ResultDto {
|
||||
@@ -107,7 +107,7 @@ class MangaDexAuthService(
|
||||
.headers(headers)
|
||||
.cacheControl(CacheControl.FORCE_NETWORK)
|
||||
.build(),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun followManga(mangaId: String): ResultDto {
|
||||
@@ -117,7 +117,7 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun unfollowManga(mangaId: String): ResultDto {
|
||||
@@ -128,7 +128,7 @@ class MangaDexAuthService(
|
||||
.headers(headers)
|
||||
.cacheControl(CacheControl.FORCE_NETWORK)
|
||||
.build(),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun updateMangaRating(mangaId: String, rating: Int): ResultDto {
|
||||
@@ -139,7 +139,7 @@ class MangaDexAuthService(
|
||||
body = MdUtil.encodeToBody(RatingDto(rating)),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun deleteMangaRating(mangaId: String): ResultDto {
|
||||
@@ -150,7 +150,7 @@ class MangaDexAuthService(
|
||||
.headers(headers)
|
||||
.cacheControl(CacheControl.FORCE_NETWORK)
|
||||
.build(),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun mangasRating(vararg mangaIds: String): RatingResponseDto {
|
||||
@@ -167,6 +167,6 @@ class MangaDexAuthService(
|
||||
headers,
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package exh.md.service
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import exh.md.dto.AggregateDto
|
||||
import exh.md.dto.AtHomeDto
|
||||
@@ -45,7 +45,7 @@ class MangaDexService(
|
||||
.build(),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun viewManga(
|
||||
@@ -64,7 +64,7 @@ class MangaDexService(
|
||||
.build(),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun mangasRating(
|
||||
@@ -82,7 +82,7 @@ class MangaDexService(
|
||||
.build(),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun aggregateChapters(
|
||||
@@ -101,7 +101,7 @@ class MangaDexService(
|
||||
.build(),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
private fun String.splitString() = replace("\n", "").split(',').trimAll().dropEmpty()
|
||||
@@ -142,18 +142,18 @@ class MangaDexService(
|
||||
url,
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun viewChapter(id: String): ChapterDto {
|
||||
return client.newCall(GET("${MdApi.chapter}/$id", cache = CacheControl.FORCE_NETWORK))
|
||||
.await()
|
||||
.awaitSuccess()
|
||||
.parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun randomManga(): MangaDto {
|
||||
return client.newCall(GET("${MdApi.manga}/random", cache = CacheControl.FORCE_NETWORK))
|
||||
.await()
|
||||
.awaitSuccess()
|
||||
.parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ class MangaDexService(
|
||||
body = MdUtil.encodeToBody(atHomeImageReportDto),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
suspend fun getAtHomeServer(
|
||||
@@ -172,7 +172,7 @@ class MangaDexService(
|
||||
headers: Headers,
|
||||
): AtHomeDto {
|
||||
return client.newCall(GET(atHomeRequestUrl, headers, CacheControl.FORCE_NETWORK))
|
||||
.await()
|
||||
.awaitSuccess()
|
||||
.parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
|
||||
@@ -187,6 +187,6 @@ class MangaDexService(
|
||||
.build(),
|
||||
cache = CacheControl.FORCE_NETWORK,
|
||||
),
|
||||
).await().parseAs(MdUtil.jsonParser)
|
||||
).awaitSuccess().parseAs(MdUtil.jsonParser)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package exh.md.service
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import exh.md.dto.SimilarMangaDto
|
||||
import exh.md.utils.MdUtil
|
||||
@@ -15,6 +15,6 @@ class SimilarService(
|
||||
GET(
|
||||
"${MdUtil.similarBaseApi}$mangaId.json",
|
||||
),
|
||||
).await().parseAs()
|
||||
).awaitSuccess().parseAs()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.data.track.TrackManager
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||
@@ -52,7 +52,7 @@ class MyAnimeList : API("https://api.jikan.moe/v4/") {
|
||||
.addPathSegment("recommendations")
|
||||
.build()
|
||||
|
||||
val data = client.newCall(GET(apiUrl)).await().parseAs<JsonObject>()
|
||||
val data = client.newCall(GET(apiUrl)).awaitSuccess().parseAs<JsonObject>()
|
||||
return data["data"]!!.jsonArray
|
||||
.map { it.jsonObject["entry"]!!.jsonObject }
|
||||
.map { rec ->
|
||||
@@ -88,7 +88,7 @@ class MyAnimeList : API("https://api.jikan.moe/v4/") {
|
||||
.addQueryParameter("q", search)
|
||||
.build()
|
||||
|
||||
val data = client.newCall(GET(url)).await()
|
||||
val data = client.newCall(GET(url)).awaitSuccess()
|
||||
.parseAs<JsonObject>()
|
||||
return getRecsById(data["data"]!!.jsonArray.first().jsonObject["mal_id"]!!.jsonPrimitive.content)
|
||||
}
|
||||
@@ -137,7 +137,7 @@ class Anilist : API("https://graphql.anilist.co/") {
|
||||
}
|
||||
val payloadBody = payload.toString().toRequestBody("application/json; charset=utf-8".toMediaType())
|
||||
|
||||
val data = client.newCall(POST(endpoint, body = payloadBody)).await()
|
||||
val data = client.newCall(POST(endpoint, body = payloadBody)).awaitSuccess()
|
||||
.parseAs<JsonObject>()
|
||||
|
||||
val media = data["data"]!!
|
||||
|
||||
@@ -3,7 +3,7 @@ package exh.uconfig
|
||||
import android.content.Context
|
||||
import eu.kanade.domain.UnsortedPreferences
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.network.await
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.source.SourceManager
|
||||
import eu.kanade.tachiyomi.source.online.all.EHentai
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
@@ -46,7 +46,7 @@ class EHConfigurator(val context: Context) {
|
||||
)
|
||||
.build(),
|
||||
)
|
||||
.await()
|
||||
.awaitSuccess()
|
||||
|
||||
private val EHentai.uconfigUrl get() = baseUrl + UCONFIG_URL
|
||||
|
||||
@@ -60,7 +60,7 @@ class EHConfigurator(val context: Context) {
|
||||
.url(HATH_PERKS_URL)
|
||||
.build(),
|
||||
)
|
||||
.await().asJsoup()
|
||||
.awaitSuccess().asJsoup()
|
||||
|
||||
val hathPerks = EHHathPerksResponse()
|
||||
|
||||
@@ -90,7 +90,7 @@ class EHConfigurator(val context: Context) {
|
||||
private suspend fun configure(source: EHentai, hathPerks: EHHathPerksResponse) {
|
||||
// Delete old app profiles
|
||||
val scanReq = source.requestWithCreds().url(source.uconfigUrl).build()
|
||||
val resp = configuratorClient.newCall(scanReq).await().asJsoup()
|
||||
val resp = configuratorClient.newCall(scanReq).awaitSuccess().asJsoup()
|
||||
var lastDoc = resp
|
||||
resp.select(PROFILE_SELECTOR).forEach {
|
||||
if (it.text() == PROFILE_NAME) {
|
||||
@@ -129,7 +129,7 @@ class EHConfigurator(val context: Context) {
|
||||
.url(source.uconfigUrl)
|
||||
.post(form)
|
||||
.build(),
|
||||
).await()
|
||||
).awaitSuccess()
|
||||
|
||||
// Persist slot + sk
|
||||
source.spPref().set(slot)
|
||||
|
||||
@@ -1,17 +1,11 @@
|
||||
package exh.util
|
||||
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import okhttp3.Call
|
||||
import okhttp3.Callback
|
||||
import okhttp3.Response
|
||||
import okhttp3.internal.closeQuietly
|
||||
import rx.Observable
|
||||
import rx.Producer
|
||||
import rx.Subscription
|
||||
import java.io.IOException
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.resumeWithException
|
||||
|
||||
fun Call.asObservableWithAsyncStacktrace(): Observable<Pair<Exception, Response>> {
|
||||
// Record stacktrace at creation time for easier debugging
|
||||
@@ -58,34 +52,3 @@ fun Call.asObservableWithAsyncStacktrace(): Observable<Pair<Exception, Response>
|
||||
subscriber.setProducer(requestArbiter)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to [Call.await] but it doesn't throw when the response is not successful
|
||||
*/
|
||||
suspend fun Call.awaitResponse(): Response {
|
||||
return suspendCancellableCoroutine { continuation ->
|
||||
enqueue(
|
||||
object : Callback {
|
||||
override fun onResponse(call: Call, response: Response) {
|
||||
continuation.resume(response) {
|
||||
response.closeQuietly()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call, e: IOException) {
|
||||
// Don't bother with resuming the continuation if it is already cancelled.
|
||||
if (continuation.isCancelled) return
|
||||
continuation.resumeWithException(e)
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
continuation.invokeOnCancellation {
|
||||
try {
|
||||
cancel()
|
||||
} catch (ex: Throwable) {
|
||||
// Ignore cancel exception
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user