From dc46e522af6fcf05a376770b982fb457d2df08c8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Oct 2025 15:28:31 +0200 Subject: [PATCH] Improve API of interface WellknownRetriever to be able to distinguish between 404 and other errors. --- .../libraries/matrix/impl/RustMatrixClient.kt | 2 +- .../impl/DefaultSessionWellknownRetriever.kt | 42 +++++++++---------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index c646e2ee18..94a562c160 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -286,7 +286,7 @@ class RustMatrixClient( override suspend fun getUrl(url: String): Result = withContext(sessionDispatcher) { runCatchingExceptions { innerClient.getUrl(url) - } + }.mapFailure { it.mapClientException() } } override suspend fun getRoom(roomId: RoomId): BaseRoom? = withContext(sessionDispatcher) { diff --git a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt index 1c7e28e62c..81b4d99134 100644 --- a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt +++ b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt @@ -13,6 +13,7 @@ import io.element.android.libraries.androidutils.json.JsonProvider import io.element.android.libraries.core.extensions.mapCatchingExceptions import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.exception.ClientException import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.SessionWellknownRetriever import io.element.android.libraries.wellknown.api.WellKnown @@ -33,18 +34,9 @@ class DefaultSessionWellknownRetriever( .getUrl(url) .mapCatchingExceptions { val data = String(it) - json().decodeFromString(InternalWellKnown.serializer(), data) + json().decodeFromString(data).map() } - .onFailure { Timber.e(it, "Failed to retrieve .well-known from $domain") } - .map { it.map() } - .fold( - onSuccess = { - WellknownRetrieverResult.Success(it) - }, - onFailure = { - WellknownRetrieverResult.Error(it as Exception) - } - ) + .toWellknownRetrieverResult() } override suspend fun getElementWellKnown(): WellknownRetrieverResult { @@ -53,17 +45,23 @@ class DefaultSessionWellknownRetriever( .getUrl(url) .mapCatchingExceptions { val data = String(it) - json().decodeFromString(InternalElementWellKnown.serializer(), data) + json().decodeFromString(data).map() } - .onFailure { Timber.e(it, "Failed to retrieve Element .well-known from $domain") } - .map { it.map() } - .fold( - onSuccess = { - WellknownRetrieverResult.Success(it) - }, - onFailure = { - WellknownRetrieverResult.Error(it as Exception) - } - ) + .toWellknownRetrieverResult() } + + private fun Result.toWellknownRetrieverResult(): WellknownRetrieverResult = fold( + onSuccess = { + WellknownRetrieverResult.Success(it) + }, + onFailure = { + Timber.e(it, "Failed to retrieve Element .well-known from $domain") + // This check on message value is not ideal but this is what we got from the SDK. + if ((it as? ClientException.Generic)?.message?.contains("404") == true) { + WellknownRetrieverResult.NotFound + } else { + WellknownRetrieverResult.Error(it as Exception) + } + } + ) }