From 58f73fac975b975611eb803aa1ff2f527a99fdb2 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 5 Feb 2019 12:55:46 +0800 Subject: [PATCH] RetryAfterError handling in KtorRequestsExecutor --- CHANGELOG.md | 2 ++ .../TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt | 12 +++++++++++- .../TelegramBotAPI/types/RequestError.kt | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c76366160..d39a21fb03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ must be regular text * Add `RequestError` sealed class and described in documentation known errors * Add `ResponseParametersRaw` which can create error based on input parameters * Add `parameters` field in `Response` and remove useless fields from `Response` +* Add `leftToRetry` parameter in `RetryAfterError` +* Add handling of `RetryAfterError` in `KtorRequestsExecutor` ### 0.9.3 diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt index 0fa0bc6760..a9c7e94aa1 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt @@ -8,11 +8,13 @@ import com.github.insanusmokrassar.TelegramBotAPI.bot.settings.limiters.EmptyLim import com.github.insanusmokrassar.TelegramBotAPI.bot.settings.limiters.RequestLimiter import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request import com.github.insanusmokrassar.TelegramBotAPI.types.Response +import com.github.insanusmokrassar.TelegramBotAPI.types.RetryAfterError import io.ktor.client.HttpClient import io.ktor.client.call.HttpClientCall import io.ktor.client.engine.HttpClientEngine import io.ktor.client.engine.okhttp.OkHttp import io.ktor.util.cio.toByteArray +import kotlinx.coroutines.delay import kotlinx.io.charsets.Charset import kotlinx.serialization.json.JSON @@ -64,7 +66,15 @@ class KtorRequestsExecutor( Response.serializer(request.resultSerializer()), content ) - responseObject.result ?: call.let { + responseObject.result ?: responseObject.parameters ?.let { + val error = it.error + if (error is RetryAfterError) { + delay(error.leftToRetry) + execute(request) + } else { + null + } + } ?: call.let { throw RequestException( responseObject, "Can't get result object" diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/RequestError.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/RequestError.kt index 1d0bbe31f2..4579ed914f 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/RequestError.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/RequestError.kt @@ -9,6 +9,8 @@ data class RetryAfterError( val startCountingMillis: Long ) : RequestError() { val canContinue = TimeUnit.SECONDS.toMillis(seconds) + startCountingMillis + val leftToRetry: Long + get() = canContinue - System.currentTimeMillis() } data class MigrateChatId(