From 17c20b2bf9ad624256c8172a9ec0c56e97100282 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 7 Nov 2020 17:50:08 +0200 Subject: [PATCH] Handle CloudFlare protection #13 --- .../CloudFlareProtectedException.kt | 5 ++++ .../core/network/CloudFlareInterceptor.kt | 26 +++++++++++++++++++ .../kotatsu/core/network/NetworkModule.kt | 2 +- .../UserAgentInterceptor.kt | 2 +- .../kotatsu/parsers/RemoteRepositoryTest.kt | 2 +- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/network/CloudFlareInterceptor.kt rename app/src/main/java/org/koitharu/kotatsu/core/{parser => network}/UserAgentInterceptor.kt (92%) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt new file mode 100644 index 000000000..6705ff77d --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt @@ -0,0 +1,5 @@ +package org.koitharu.kotatsu.core.exceptions + +import okio.IOException + +class CloudFlareProtectedException(val url: String) : IOException("Protected by CloudFlare") \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/CloudFlareInterceptor.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/CloudFlareInterceptor.kt new file mode 100644 index 000000000..9d6a321cd --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/CloudFlareInterceptor.kt @@ -0,0 +1,26 @@ +package org.koitharu.kotatsu.core.network + +import okhttp3.Interceptor +import okhttp3.Response +import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException +import java.net.HttpURLConnection.HTTP_FORBIDDEN +import java.net.HttpURLConnection.HTTP_UNAVAILABLE + +class CloudFlareInterceptor : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val response = chain.proceed(chain.request()) + if (response.code == HTTP_FORBIDDEN || response.code == HTTP_UNAVAILABLE) { + if (response.header(HEADER_SERVER)?.startsWith(SERVER_CLOUDFLARE) == true) { + throw CloudFlareProtectedException(chain.request().url.toString()) + } + } + return response + } + + private companion object { + + private const val HEADER_SERVER = "Server" + private const val SERVER_CLOUDFLARE = "cloudflare" + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt index 32a5d922e..71e997f29 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt @@ -7,7 +7,6 @@ import org.koin.dsl.module import org.koitharu.kotatsu.core.network.cookies.PersistentCookieJar import org.koitharu.kotatsu.core.network.cookies.cache.SetCookieCache import org.koitharu.kotatsu.core.network.cookies.persistence.SharedPrefsCookiePersistor -import org.koitharu.kotatsu.core.parser.UserAgentInterceptor import org.koitharu.kotatsu.utils.CacheUtils import java.util.concurrent.TimeUnit @@ -27,6 +26,7 @@ val networkModule cookieJar(get()) cache(CacheUtils.createHttpCache(androidContext())) addInterceptor(UserAgentInterceptor()) + addInterceptor(CloudFlareInterceptor()) }.build() } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/UserAgentInterceptor.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/UserAgentInterceptor.kt index 7d2e73d1a..3ea21ce2f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/UserAgentInterceptor.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.parser +package org.koitharu.kotatsu.core.network import android.os.Build import okhttp3.Interceptor diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt index ff546f9c2..43c2a1840 100644 --- a/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt +++ b/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt @@ -12,7 +12,7 @@ import org.koin.dsl.module import org.koin.test.KoinTest import org.koin.test.get import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.core.parser.UserAgentInterceptor +import org.koitharu.kotatsu.core.network.UserAgentInterceptor import org.koitharu.kotatsu.core.prefs.SourceSettings import org.koitharu.kotatsu.domain.MangaLoaderContext import org.koitharu.kotatsu.utils.AssertX