|
@@ -5,6 +5,7 @@ import okhttp3.HttpUrl
|
|
|
import okhttp3.Interceptor
|
|
|
import okhttp3.OkHttpClient
|
|
|
import okhttp3.Response
|
|
|
+import java.io.IOException
|
|
|
import java.util.concurrent.TimeUnit
|
|
|
|
|
|
/**
|
|
@@ -41,9 +42,13 @@ class SpecificHostRateLimitInterceptor(
|
|
|
private val host = httpUrl.host
|
|
|
|
|
|
override fun intercept(chain: Interceptor.Chain): Response {
|
|
|
- if (chain.request().url.host != host) {
|
|
|
+ // Ignore canceled calls, otherwise they would jam the queue
|
|
|
+ if (chain.call().isCanceled()) {
|
|
|
+ throw IOException()
|
|
|
+ } else if (chain.request().url.host != host) {
|
|
|
return chain.proceed(chain.request())
|
|
|
}
|
|
|
+
|
|
|
synchronized(requestQueue) {
|
|
|
val now = SystemClock.elapsedRealtime()
|
|
|
val waitTime = if (requestQueue.size < permits) {
|
|
@@ -59,6 +64,11 @@ class SpecificHostRateLimitInterceptor(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Final check
|
|
|
+ if (chain.call().isCanceled()) {
|
|
|
+ throw IOException()
|
|
|
+ }
|
|
|
+
|
|
|
if (requestQueue.size == permits) {
|
|
|
requestQueue.removeAt(0)
|
|
|
}
|