|
|
|
@ -3,20 +3,21 @@ package org.koitharu.kotatsu.core.network
|
|
|
|
import okhttp3.Interceptor
|
|
|
|
import okhttp3.Interceptor
|
|
|
|
import okhttp3.Response
|
|
|
|
import okhttp3.Response
|
|
|
|
import okhttp3.internal.closeQuietly
|
|
|
|
import okhttp3.internal.closeQuietly
|
|
|
|
|
|
|
|
import org.jsoup.Jsoup
|
|
|
|
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
|
|
|
|
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
|
|
|
import java.net.HttpURLConnection.HTTP_FORBIDDEN
|
|
|
|
import java.net.HttpURLConnection.HTTP_FORBIDDEN
|
|
|
|
import java.net.HttpURLConnection.HTTP_UNAVAILABLE
|
|
|
|
import java.net.HttpURLConnection.HTTP_UNAVAILABLE
|
|
|
|
|
|
|
|
|
|
|
|
private const val HEADER_SERVER = "Server"
|
|
|
|
|
|
|
|
private const val SERVER_CLOUDFLARE = "cloudflare"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CloudFlareInterceptor : Interceptor {
|
|
|
|
class CloudFlareInterceptor : Interceptor {
|
|
|
|
|
|
|
|
|
|
|
|
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.code == HTTP_FORBIDDEN || response.code == HTTP_UNAVAILABLE) {
|
|
|
|
if (response.code == HTTP_FORBIDDEN || response.code == HTTP_UNAVAILABLE) {
|
|
|
|
if (response.header(HEADER_SERVER)?.startsWith(SERVER_CLOUDFLARE) == true) {
|
|
|
|
val content = response.body?.source()?.peek()?.use {
|
|
|
|
|
|
|
|
Jsoup.parse(it.inputStream(), Charsets.UTF_8.name(), response.request.url.toString())
|
|
|
|
|
|
|
|
} ?: return response
|
|
|
|
|
|
|
|
if (content.getElementById("challenge-error-title") != null) {
|
|
|
|
val request = response.request
|
|
|
|
val request = response.request
|
|
|
|
response.closeQuietly()
|
|
|
|
response.closeQuietly()
|
|
|
|
throw CloudFlareProtectedException(
|
|
|
|
throw CloudFlareProtectedException(
|
|
|
|
|