@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.extension.all.hitomi
2
2
3
3
import android.app.Application
4
4
import android.content.SharedPreferences
5
+ import android.util.Log
5
6
import androidx.preference.ListPreference
6
7
import androidx.preference.PreferenceScreen
7
8
import eu.kanade.tachiyomi.network.GET
@@ -29,6 +30,7 @@ import okhttp3.MediaType.Companion.toMediaType
29
30
import okhttp3.Request
30
31
import okhttp3.Response
31
32
import okhttp3.ResponseBody.Companion.toResponseBody
33
+ import okhttp3.internal.http2.StreamResetException
32
34
import rx.Observable
33
35
import uy.kohesive.injekt.Injekt
34
36
import uy.kohesive.injekt.api.get
@@ -42,6 +44,7 @@ import java.util.LinkedList
42
44
import java.util.Locale
43
45
import kotlin.math.max
44
46
import kotlin.math.min
47
+ import kotlin.time.Duration.Companion.seconds
45
48
46
49
@OptIn(ExperimentalUnsignedTypes ::class )
47
50
class Hitomi (
@@ -62,7 +65,10 @@ class Hitomi(
62
65
private val json: Json by injectLazy()
63
66
64
67
override val client = network.cloudflareClient.newBuilder()
65
- .addInterceptor(::Intercept )
68
+ .addInterceptor(::jxlContentTypeInterceptor)
69
+ .apply {
70
+ interceptors().add(0 , ::streamResetRetry)
71
+ }
66
72
.build()
67
73
68
74
private val preferences: SharedPreferences by lazy {
@@ -708,7 +714,7 @@ class Hitomi(
708
714
return this .sliceArray(byteArray.indices).contentEquals(byteArray)
709
715
}
710
716
711
- private fun Intercept (chain : Interceptor .Chain ): Response {
717
+ private fun jxlContentTypeInterceptor (chain : Interceptor .Chain ): Response {
712
718
val response = chain.proceed(chain.request())
713
719
if (response.headers[" Content-Type" ] != " application/octet-stream" ) {
714
720
return response
@@ -728,6 +734,20 @@ class Hitomi(
728
734
.build()
729
735
}
730
736
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
+
731
751
override fun popularMangaParse (response : Response ) = throw UnsupportedOperationException ()
732
752
override fun popularMangaRequest (page : Int ) = throw UnsupportedOperationException ()
733
753
override fun latestUpdatesRequest (page : Int ) = throw UnsupportedOperationException ()
0 commit comments