From d673616bb48f88fb6a3e90a1cfd1180e0484afe7 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Thu, 27 Jul 2023 22:55:28 +0200 Subject: [PATCH] Add OkHttp interceptor to raise exceptions for non-successfull requests --- .../main/java/com/readrops/api/ApiModule.kt | 4 ++ .../readrops/api/utils/ErrorInterceptor.kt | 19 +++++++++ .../api/utils/exceptions/HttpException.kt | 13 +++++++ .../api/utils/ErrorInterceptorTest.kt | 39 +++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 api/src/main/java/com/readrops/api/utils/ErrorInterceptor.kt create mode 100644 api/src/main/java/com/readrops/api/utils/exceptions/HttpException.kt create mode 100644 api/src/test/java/com/readrops/api/utils/ErrorInterceptorTest.kt diff --git a/api/src/main/java/com/readrops/api/ApiModule.kt b/api/src/main/java/com/readrops/api/ApiModule.kt index 2c43dac8..3d1258eb 100644 --- a/api/src/main/java/com/readrops/api/ApiModule.kt +++ b/api/src/main/java/com/readrops/api/ApiModule.kt @@ -11,6 +11,7 @@ import com.readrops.api.services.nextcloudnews.adapters.NextNewsFeedsAdapter import com.readrops.api.services.nextcloudnews.adapters.NextNewsFoldersAdapter import com.readrops.api.services.nextcloudnews.adapters.NextNewsItemsAdapter import com.readrops.api.utils.AuthInterceptor +import com.readrops.api.utils.ErrorInterceptor import com.readrops.db.entities.Item import com.squareup.moshi.Moshi import com.squareup.moshi.Types @@ -29,12 +30,15 @@ val apiModule = module { .callTimeout(1, TimeUnit.MINUTES) .readTimeout(1, TimeUnit.HOURS) .addInterceptor(get()) + .addInterceptor(get()) //.addInterceptor(NiddlerOkHttpInterceptor(get(), "niddler")) .build() } single { AuthInterceptor() } + single { ErrorInterceptor() } + single { LocalRSSDataSource(get()) } //region freshrss diff --git a/api/src/main/java/com/readrops/api/utils/ErrorInterceptor.kt b/api/src/main/java/com/readrops/api/utils/ErrorInterceptor.kt new file mode 100644 index 00000000..a0b8bb94 --- /dev/null +++ b/api/src/main/java/com/readrops/api/utils/ErrorInterceptor.kt @@ -0,0 +1,19 @@ +package com.readrops.api.utils + +import com.readrops.api.utils.exceptions.HttpException +import okhttp3.Interceptor +import okhttp3.Response + +class ErrorInterceptor() : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + + if (!response.isSuccessful) { + throw HttpException(response) + } + + return response + } +} \ No newline at end of file diff --git a/api/src/main/java/com/readrops/api/utils/exceptions/HttpException.kt b/api/src/main/java/com/readrops/api/utils/exceptions/HttpException.kt new file mode 100644 index 00000000..b3aa3062 --- /dev/null +++ b/api/src/main/java/com/readrops/api/utils/exceptions/HttpException.kt @@ -0,0 +1,13 @@ +package com.readrops.api.utils.exceptions + +import okhttp3.Response + + +class HttpException(val response: Response) : Exception() { + + val code: Int + get() = response.code + + override val message: String + get() = "HTTP " + response.code + " " + response.message +} \ No newline at end of file diff --git a/api/src/test/java/com/readrops/api/utils/ErrorInterceptorTest.kt b/api/src/test/java/com/readrops/api/utils/ErrorInterceptorTest.kt new file mode 100644 index 00000000..22f243c5 --- /dev/null +++ b/api/src/test/java/com/readrops/api/utils/ErrorInterceptorTest.kt @@ -0,0 +1,39 @@ +package com.readrops.api.utils + +import com.readrops.api.utils.exceptions.HttpException +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.net.HttpURLConnection + +class ErrorInterceptorTest { + + private val interceptor = ErrorInterceptor() + private val server = MockWebServer() + private lateinit var client: OkHttpClient + + @Before + fun before() { + client = OkHttpClient.Builder() + .addInterceptor(interceptor) + .build() + server.start(8080) + } + + @After + fun tearDown() { + server.close() + } + + @Test(expected = HttpException::class) + fun interceptorTest() { + server.enqueue(MockResponse().setResponseCode(HttpURLConnection.HTTP_NOT_FOUND)) + + client.newCall(Request.Builder().url(server.url("/url")).build()).execute() + //val request = server.takeRequest() + } +} \ No newline at end of file