Fix closing response in interceptors

master
Koitharu 2 years ago
parent 95bbfefe90
commit 645006fde8
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -6,6 +6,7 @@ import androidx.collection.set
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.Response import okhttp3.Response
import okhttp3.internal.closeQuietly
import okhttp3.internal.headersContentLength import okhttp3.internal.headersContentLength
import org.jsoup.internal.StringUtil import org.jsoup.internal.StringUtil
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
@ -284,10 +285,11 @@ internal class ExHentaiParser(
val response = chain.proceed(chain.request()) val response = chain.proceed(chain.request())
if (response.headersContentLength() <= 256) { if (response.headersContentLength() <= 256) {
val text = response.peekBody(256).string() val text = response.peekBody(256).string()
if (text.startsWith("Your IP address has been temporarily banned")) { if (text.startsWith("Your IP address has been temporarily banned", ignoreCase = true)) {
val hours = Regex("([0-9]+) hours?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0 val hours = Regex("([0-9]+) hours?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0
val minutes = Regex("([0-9]+) minutes?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0 val minutes = Regex("([0-9]+) minutes?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0
val seconds = Regex("([0-9]+) seconds?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0 val seconds = Regex("([0-9]+) seconds?").find(text)?.groupValues?.getOrNull(1)?.toLongOrNull() ?: 0
response.closeQuietly()
throw TooManyRequestExceptions( throw TooManyRequestExceptions(
url = response.request.url.toString(), url = response.request.url.toString(),
retryAfter = TimeUnit.HOURS.toMillis(hours) retryAfter = TimeUnit.HOURS.toMillis(hours)

@ -406,9 +406,8 @@ internal abstract class MangaFireParser(
return response return response
} }
val offset = request.url.fragment!!.substringAfter("_").toInt()
return context.redrawImageResponse(response) { bitmap -> return context.redrawImageResponse(response) { bitmap ->
val offset = request.url.fragment!!.substringAfter("_").toInt()
val width = bitmap.width val width = bitmap.width
val height = bitmap.height val height = bitmap.height

@ -227,14 +227,11 @@ internal abstract class MangaPlusParser(
return response return response
} }
val contentType = response.headers["Content-Type"] ?: "image/jpeg" return response.map { responseBody ->
val contentType = response.headers["Content-Type"] ?: "image/jpeg"
val image = requireNotNull(response.body).bytes().decodeXorCipher(encryptionKey) val image = responseBody.bytes().decodeXorCipher(encryptionKey)
val body = image.toResponseBody(contentType.toMediaTypeOrNull()) image.toResponseBody(contentType.toMediaTypeOrNull())
}
return response.newBuilder()
.body(body)
.build()
} }
private fun ByteArray.decodeXorCipher(key: String): ByteArray { private fun ByteArray.decodeXorCipher(key: String): ByteArray {

@ -128,9 +128,11 @@ internal class LuratoonScansParser(context: MangaLoaderContext) :
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
val response = chain.proceed(chain.request()) val response = chain.proceed(chain.request())
if (response.mimeType == "application/octet-stream") { if (response.mimeType == "application/octet-stream") {
val (bytes, name) = ZipInputStream(checkNotNull(response.body).byteStream()).use { val (bytes, name) = response.use { resp ->
val entry = it.nextEntry ZipInputStream(resp.requireBody().byteStream()).use {
it.readBytes() to entry?.name val entry = it.nextEntry
it.readBytes() to entry?.name
}
} }
val type = if (name?.endsWith(".avif", ignoreCase = true) == true) { val type = if (name?.endsWith(".avif", ignoreCase = true) == true) {
"image/avif" "image/avif"

@ -189,8 +189,8 @@ internal class CuuTruyenParser(context: MangaLoaderContext) :
return response return response
} }
val drmData = fragment.substringAfter(DRM_DATA_KEY)
return context.redrawImageResponse(response) { bitmap -> return context.redrawImageResponse(response) { bitmap ->
val drmData = fragment.substringAfter(DRM_DATA_KEY)
unscrambleImage(bitmap, drmData) unscrambleImage(bitmap, drmData)
} }
} }

Loading…
Cancel
Save