From 8a70dffae84dcb9db4f1fd563888b0d8f1d2dee9 Mon Sep 17 00:00:00 2001 From: NerdNumber9 Date: Sun, 14 Apr 2019 00:27:44 -0400 Subject: [PATCH] Preserve async stack traces of http requests --- .../eu/kanade/tachiyomi/network/OkHttpExtensions.kt | 8 ++++++++ app/src/main/java/exh/util/ExceptionUtil.kt | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt index d82a75923..f43fa1317 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.network +import exh.util.withRootCause import okhttp3.Call import okhttp3.OkHttpClient import okhttp3.Request @@ -47,11 +48,18 @@ fun Call.asObservable(): Observable { } fun Call.asObservableSuccess(): Observable { + // Record stacktrace at creation time for easier debugging + // asObservable is involved in a lot of crashes so this is worth the performance hit + val asyncStackTrace = Exception("Async stacktrace") + return asObservable().doOnNext { response -> if (!response.isSuccessful) { response.close() throw Exception("HTTP error ${response.code()}") } + }.onErrorReturn { + // Set root cause to async stacktrace and throw again + throw it.withRootCause(asyncStackTrace) } } diff --git a/app/src/main/java/exh/util/ExceptionUtil.kt b/app/src/main/java/exh/util/ExceptionUtil.kt index 5ae80d525..084523106 100644 --- a/app/src/main/java/exh/util/ExceptionUtil.kt +++ b/app/src/main/java/exh/util/ExceptionUtil.kt @@ -4,4 +4,14 @@ inline fun ignore(expr: () -> T): T? { return try { expr() } catch (t: Throwable) { null } } +fun T.withRootCause(cause: Throwable): T { + val curCause = this.cause + if(curCause == null) { + this.initCause(cause) + } else { + curCause.withRootCause(cause) + } + + return this +} \ No newline at end of file