gotoOla
07/08/2019, 3:39 PMtseisel
07/08/2019, 3:42 PMHttpRedirect
, I wrote a feature that automatically retry a request after the given delay if it received the Http Code "Too Many Requests" :
class RetryAfter {
companion object : HttpClientFeature<Unit, RetryAfter> {
override val key: AttributeKey<RetryAfter> = AttributeKey("RetryFeature")
override fun prepare(block: Unit.() -> Unit): RetryAfter = RetryAfter()
override fun install(feature: RetryAfter, scope: HttpClient) {
scope.feature(HttpSend)!!.intercept { origin ->
val status = origin.response.status
val retryAfterSeconds = origin.response.headers[HttpHeaders.RetryAfter]?.toLongOrNull()
if (status != HttpStatusCode.TooManyRequests || retryAfterSeconds == null) {
origin
} else {
origin.close()
delay((retryAfterSeconds + 1) * 1000)
execute(HttpRequestBuilder().apply {
takeFrom(origin.request)
})
}
}
}
}
}