Skip to content

Commit

Permalink
add handling of 429 status
Browse files Browse the repository at this point in the history
  • Loading branch information
InsanusMokrassar committed Nov 11, 2020
1 parent 66b4d06 commit d83e3eb
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.inmo.tgbotapi.bot.Ktor.base

import dev.inmo.micro_utils.coroutines.safely
import dev.inmo.tgbotapi.bot.Ktor.KtorCallFactory
import dev.inmo.tgbotapi.bot.exceptions.newRequestException
import dev.inmo.tgbotapi.requests.GetUpdates
Expand Down Expand Up @@ -51,15 +52,17 @@ abstract class AbstractRequestCallFactory : KtorCallFactory {
val content = response.receive<String>()
val responseObject = jsonFormatter.decodeFromString(Response.serializer(), content)

return (responseObject.result?.let {
jsonFormatter.decodeFromJsonElement(request.resultDeserializer, it)
} ?: response.let {
throw newRequestException(
responseObject,
content,
"Can't get result object from $content"
)
})
return safely {
(responseObject.result?.let {
jsonFormatter.decodeFromJsonElement(request.resultDeserializer, it)
} ?: response.let {
throw newRequestException(
responseObject,
content,
"Can't get result object from $content"
)
})
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package dev.inmo.tgbotapi.bot.settings.limiters
import dev.inmo.micro_utils.coroutines.safely
import dev.inmo.tgbotapi.bot.exceptions.TooMuchRequestsException
import dev.inmo.tgbotapi.types.RetryAfterError
import io.ktor.client.features.ClientRequestException
import io.ktor.http.HttpStatusCode
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*

Expand All @@ -16,18 +18,34 @@ object ExceptionsOnlyLimiter : RequestLimiter {
while (true) {
lockState.first { !it }
val result = safely({
if (it is TooMuchRequestsException) {
try {
safely {
lockState.emit(true)
delay(it.retryAfter.leftToRetry)
when (it) {
is TooMuchRequestsException -> {
try {
safely {
lockState.emit(true)
delay(it.retryAfter.leftToRetry)
}
} finally {
lockState.emit(false)
}
} finally {
lockState.emit(false)
Result.failure(it)
}
Result.failure(it)
} else {
throw it
is ClientRequestException -> {
if (it.response.status == HttpStatusCode.TooManyRequests) {
try {
safely {
lockState.emit(true)
delay(1000L)
}
} finally {
lockState.emit(false)
}
} else {
throw it
}
Result.failure(it)
}
else -> throw it
}
}) {
Result.success(block())
Expand Down

0 comments on commit d83e3eb

Please sign in to comment.