Browse Source

Fix extension interceptors receiving compressed responses (#10388)

stevenyomi 1 year ago
parent
commit
d6c4af89c4

+ 3 - 1
core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt

@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.network
 
 import android.content.Context
 import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor
+import eu.kanade.tachiyomi.network.interceptor.IgnoreGzipInterceptor
 import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor
 import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor
 import okhttp3.Cache
@@ -30,9 +31,10 @@ class NetworkHelper(
                     maxSize = 5L * 1024 * 1024, // 5 MiB
                 ),
             )
-            .addInterceptor(BrotliInterceptor)
             .addInterceptor(UncaughtExceptionInterceptor())
             .addInterceptor(UserAgentInterceptor(::defaultUserAgentProvider))
+            .addNetworkInterceptor(IgnoreGzipInterceptor())
+            .addNetworkInterceptor(BrotliInterceptor)
 
         if (preferences.verboseLogging().get()) {
             val httpLoggingInterceptor = HttpLoggingInterceptor().apply {

+ 21 - 0
core/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt

@@ -0,0 +1,21 @@
+package eu.kanade.tachiyomi.network.interceptor
+
+import okhttp3.Interceptor
+import okhttp3.Response
+
+/**
+ * To use [okhttp3.brotli.BrotliInterceptor] as a network interceptor,
+ * add [IgnoreGzipInterceptor] right before it.
+ *
+ * This nullifies the transparent gzip of [okhttp3.internal.http.BridgeInterceptor]
+ * so gzip and Brotli are explicitly handled by the [okhttp3.brotli.BrotliInterceptor].
+ */
+class IgnoreGzipInterceptor : Interceptor {
+    override fun intercept(chain: Interceptor.Chain): Response {
+        var request = chain.request()
+        if (request.header("Accept-Encoding") == "gzip") {
+            request = request.newBuilder().removeHeader("Accept-Encoding").build()
+        }
+        return chain.proceed(request)
+    }
+}