diff --git a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.kt b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.kt index 1c28d5fe4..c54c3aefb 100644 --- a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.kt +++ b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.kt @@ -1,7 +1,11 @@ package fr.free.nrw.commons import androidx.annotation.VisibleForTesting +import fr.free.nrw.commons.wikidata.GsonUtil import fr.free.nrw.commons.wikidata.cookies.CommonsCookieJar +import fr.free.nrw.commons.wikidata.mwapi.MwErrorResponse +import fr.free.nrw.commons.wikidata.mwapi.MwIOException +import fr.free.nrw.commons.wikidata.mwapi.MwLegacyServiceError import okhttp3.Cache import okhttp3.Interceptor import okhttp3.OkHttpClient @@ -86,16 +90,25 @@ private class UnsuccessfulResponseInterceptor : Interceptor { rsp.peekBody(ERRORS_PREFIX.length.toLong()).use { responseBody -> if (ERRORS_PREFIX == responseBody.string()) { rsp.body.use { body -> - throw IOException(body!!.string()) + val bodyString = body!!.string() + + throw MwIOException( + "MediaWiki API returned error: $bodyString", + GsonUtil.defaultGson.fromJson( + bodyString, + MwErrorResponse::class.java + ).error!!, + ) } } } - } catch (e: IOException) { + } catch (e: MwIOException) { // Log the error as debug (and therefore, "expected") or at error level if (suppressErrors) { Timber.d(e, "Suppressed (known / expected) error") } else { Timber.e(e) + throw e } } return rsp diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwErrorResponse.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwErrorResponse.kt new file mode 100644 index 000000000..40f5afe68 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwErrorResponse.kt @@ -0,0 +1,7 @@ +package fr.free.nrw.commons.wikidata.mwapi + +import fr.free.nrw.commons.wikidata.model.BaseModel + +class MwErrorResponse : BaseModel() { + val error: MwLegacyServiceError? = null +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwIOException.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwIOException.kt new file mode 100644 index 000000000..62ca87166 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwIOException.kt @@ -0,0 +1,5 @@ +package fr.free.nrw.commons.wikidata.mwapi + +import java.io.IOException + +class MwIOException(string: String, val error: MwLegacyServiceError) : IOException(string) diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwLegacyServiceError.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwLegacyServiceError.kt new file mode 100644 index 000000000..16ee29709 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwLegacyServiceError.kt @@ -0,0 +1,14 @@ +package fr.free.nrw.commons.wikidata.mwapi + +import fr.free.nrw.commons.wikidata.model.BaseModel + +class MwLegacyServiceError : BaseModel() { + val code: String? = null + private val info: String? = null + + val title: String + get() = code ?: "" + + val details: String + get() = info ?: "" +} \ No newline at end of file