瀏覽代碼

Avoid uncaught exceptions from OkHttp interceptors crashing entire app

(cherry picked from commit 26d422b0aeaee2d0a7957f0f8d955e045dde1a34)
arkon 2 年之前
父節點
當前提交
9e09a20e65

+ 2 - 0
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.UncaughtExceptionInterceptor
 import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor
 import okhttp3.Cache
 import okhttp3.OkHttpClient
@@ -29,6 +30,7 @@ class NetworkHelper(context: Context) {
                 .connectTimeout(30, TimeUnit.SECONDS)
                 .readTimeout(30, TimeUnit.SECONDS)
                 .callTimeout(2, TimeUnit.MINUTES)
+                .addInterceptor(UncaughtExceptionInterceptor())
                 .addInterceptor(userAgentInterceptor)
 
             if (preferences.verboseLogging().get()) {

+ 24 - 0
core/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt

@@ -0,0 +1,24 @@
+package eu.kanade.tachiyomi.network.interceptor
+
+import okhttp3.Interceptor
+import okhttp3.Response
+import java.io.IOException
+
+/**
+ * Catches any uncaught exceptions from later in the chain and rethrows as a non-fatal
+ * IOException to avoid catastrophic failure.
+ *
+ * This should be the first interceptor in the client.
+ *
+ * See https://square.github.io/okhttp/4.x/okhttp/okhttp3/-interceptor/
+ */
+class UncaughtExceptionInterceptor : Interceptor {
+
+    override fun intercept(chain: Interceptor.Chain): Response {
+        return try {
+            chain.proceed(chain.request())
+        } catch (e: Exception) {
+            throw IOException(e)
+        }
+    }
+}