Skip to content

Commit 7055f25

Browse files
authored
Hitomi: retry on stream reset error like the website (#6802)
1 parent f15e50a commit 7055f25

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

src/all/hitomi/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ext {
22
extName = 'Hitomi'
33
extClass = '.HitomiFactory'
4-
extVersionCode = 34
4+
extVersionCode = 35
55
isNsfw = true
66
}
77

src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.extension.all.hitomi
22

33
import android.app.Application
44
import android.content.SharedPreferences
5+
import android.util.Log
56
import androidx.preference.ListPreference
67
import androidx.preference.PreferenceScreen
78
import eu.kanade.tachiyomi.network.GET
@@ -29,6 +30,7 @@ import okhttp3.MediaType.Companion.toMediaType
2930
import okhttp3.Request
3031
import okhttp3.Response
3132
import okhttp3.ResponseBody.Companion.toResponseBody
33+
import okhttp3.internal.http2.StreamResetException
3234
import rx.Observable
3335
import uy.kohesive.injekt.Injekt
3436
import uy.kohesive.injekt.api.get
@@ -42,6 +44,7 @@ import java.util.LinkedList
4244
import java.util.Locale
4345
import kotlin.math.max
4446
import kotlin.math.min
47+
import kotlin.time.Duration.Companion.seconds
4548

4649
@OptIn(ExperimentalUnsignedTypes::class)
4750
class Hitomi(
@@ -62,7 +65,10 @@ class Hitomi(
6265
private val json: Json by injectLazy()
6366

6467
override val client = network.cloudflareClient.newBuilder()
65-
.addInterceptor(::Intercept)
68+
.addInterceptor(::jxlContentTypeInterceptor)
69+
.apply {
70+
interceptors().add(0, ::streamResetRetry)
71+
}
6672
.build()
6773

6874
private val preferences: SharedPreferences by lazy {
@@ -708,7 +714,7 @@ class Hitomi(
708714
return this.sliceArray(byteArray.indices).contentEquals(byteArray)
709715
}
710716

711-
private fun Intercept(chain: Interceptor.Chain): Response {
717+
private fun jxlContentTypeInterceptor(chain: Interceptor.Chain): Response {
712718
val response = chain.proceed(chain.request())
713719
if (response.headers["Content-Type"] != "application/octet-stream") {
714720
return response
@@ -728,6 +734,20 @@ class Hitomi(
728734
.build()
729735
}
730736

737+
private fun streamResetRetry(chain: Interceptor.Chain): Response {
738+
return try {
739+
chain.proceed(chain.request())
740+
} catch (e: StreamResetException) {
741+
Log.e(name, "reset", e)
742+
if (e.message.orEmpty().contains("INTERNAL_ERROR")) {
743+
Thread.sleep(2.seconds.inWholeMilliseconds)
744+
chain.proceed(chain.request())
745+
} else {
746+
throw e
747+
}
748+
}
749+
}
750+
731751
override fun popularMangaParse(response: Response) = throw UnsupportedOperationException()
732752
override fun popularMangaRequest(page: Int) = throw UnsupportedOperationException()
733753
override fun latestUpdatesRequest(page: Int) = throw UnsupportedOperationException()

0 commit comments

Comments
 (0)