diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt index a776f2b5f7..994c3c032d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt @@ -4,6 +4,7 @@ import android.os.SystemClock import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Response +import java.io.IOException import java.util.concurrent.TimeUnit /** @@ -36,6 +37,11 @@ private class RateLimitInterceptor( private val rateLimitMillis = unit.toMillis(period) override fun intercept(chain: Interceptor.Chain): Response { + // Ignore canceled calls, otherwise they would jam the queue + if (chain.call().isCanceled()) { + throw IOException() + } + synchronized(requestQueue) { val now = SystemClock.elapsedRealtime() val waitTime = if (requestQueue.size < permits) { @@ -51,6 +57,11 @@ private class RateLimitInterceptor( } } + // Final check + if (chain.call().isCanceled()) { + throw IOException() + } + if (requestQueue.size == permits) { requestQueue.removeAt(0) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt index ec7a8fdb1d..b10b6904b5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt @@ -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) }