Handle 429 TooManyRequests error
parent
746eed698f
commit
3bea94bf1f
@ -0,0 +1,9 @@
|
|||||||
|
package org.koitharu.kotatsu.core.exceptions
|
||||||
|
|
||||||
|
import okio.IOException
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
class TooManyRequestExceptions(
|
||||||
|
val url: String,
|
||||||
|
val retryAt: Date?,
|
||||||
|
) : IOException()
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package org.koitharu.kotatsu.core.network
|
||||||
|
|
||||||
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.Response
|
||||||
|
import okhttp3.internal.closeQuietly
|
||||||
|
import org.koitharu.kotatsu.core.exceptions.TooManyRequestExceptions
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Date
|
||||||
|
import java.util.Locale
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
class RateLimitInterceptor : Interceptor {
|
||||||
|
|
||||||
|
private val dateFormat = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss ZZZ", Locale.ENGLISH)
|
||||||
|
|
||||||
|
override fun intercept(chain: Interceptor.Chain): Response {
|
||||||
|
val response = chain.proceed(chain.request())
|
||||||
|
if (response.code == 429) {
|
||||||
|
val retryDate = response.header(CommonHeaders.RETRY_AFTER)?.parseRetryDate()
|
||||||
|
val request = response.request
|
||||||
|
response.closeQuietly()
|
||||||
|
throw TooManyRequestExceptions(
|
||||||
|
url = request.url.toString(),
|
||||||
|
retryAt = retryDate,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.parseRetryDate(): Date? {
|
||||||
|
toIntOrNull()?.let {
|
||||||
|
return Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(it.toLong()))
|
||||||
|
}
|
||||||
|
return dateFormat.parse(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue