From 5b8cd68cf355a15e5d5789280524d08b4c922f23 Mon Sep 17 00:00:00 2001 From: stevenyomi <95685115+stevenyomi@users.noreply.github.com> Date: Mon, 27 Jun 2022 09:35:35 +0800 Subject: [PATCH] RateLimitInterceptor: ignore canceled calls (#7389) * RateLimitInterceptor: ignore canceled calls * SpecificHostRateLimit: ignore canceled calls --- .../network/interceptor/RateLimitInterceptor.kt | 11 +++++++++++ .../interceptor/SpecificHostRateLimitInterceptor.kt | 12 +++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) 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) }