mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-22 16:23:48 +00:00
RetryAfterError handling in KtorRequestsExecutor
This commit is contained in:
parent
c4f0ed4b48
commit
58f73fac97
@ -29,6 +29,8 @@ must be regular text
|
|||||||
* Add `RequestError` sealed class and described in documentation known errors
|
* Add `RequestError` sealed class and described in documentation known errors
|
||||||
* Add `ResponseParametersRaw` which can create error based on input parameters
|
* Add `ResponseParametersRaw` which can create error based on input parameters
|
||||||
* Add `parameters` field in `Response` and remove useless fields from `Response`
|
* 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
|
### 0.9.3
|
||||||
|
|
||||||
|
@ -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.bot.settings.limiters.RequestLimiter
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
|
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.Response
|
import com.github.insanusmokrassar.TelegramBotAPI.types.Response
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.RetryAfterError
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.call.HttpClientCall
|
import io.ktor.client.call.HttpClientCall
|
||||||
import io.ktor.client.engine.HttpClientEngine
|
import io.ktor.client.engine.HttpClientEngine
|
||||||
import io.ktor.client.engine.okhttp.OkHttp
|
import io.ktor.client.engine.okhttp.OkHttp
|
||||||
import io.ktor.util.cio.toByteArray
|
import io.ktor.util.cio.toByteArray
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.io.charsets.Charset
|
import kotlinx.io.charsets.Charset
|
||||||
import kotlinx.serialization.json.JSON
|
import kotlinx.serialization.json.JSON
|
||||||
|
|
||||||
@ -64,7 +66,15 @@ class KtorRequestsExecutor(
|
|||||||
Response.serializer(request.resultSerializer()),
|
Response.serializer(request.resultSerializer()),
|
||||||
content
|
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(
|
throw RequestException(
|
||||||
responseObject,
|
responseObject,
|
||||||
"Can't get result object"
|
"Can't get result object"
|
||||||
|
@ -9,6 +9,8 @@ data class RetryAfterError(
|
|||||||
val startCountingMillis: Long
|
val startCountingMillis: Long
|
||||||
) : RequestError() {
|
) : RequestError() {
|
||||||
val canContinue = TimeUnit.SECONDS.toMillis(seconds) + startCountingMillis
|
val canContinue = TimeUnit.SECONDS.toMillis(seconds) + startCountingMillis
|
||||||
|
val leftToRetry: Long
|
||||||
|
get() = canContinue - System.currentTimeMillis()
|
||||||
}
|
}
|
||||||
|
|
||||||
data class MigrateChatId(
|
data class MigrateChatId(
|
||||||
|
Loading…
Reference in New Issue
Block a user