diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConversationApiV4.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConversationApiV4.kt index 53ddf119b08..f5f76795f16 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConversationApiV4.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConversationApiV4.kt @@ -32,7 +32,6 @@ import com.wire.kalium.network.api.base.model.ConversationId import com.wire.kalium.network.api.base.model.GenerateGuestLinkRequest import com.wire.kalium.network.api.base.model.JoinConversationRequestV4 import com.wire.kalium.network.api.v3.authenticated.ConversationApiV3 -import com.wire.kalium.network.exceptions.KaliumException import com.wire.kalium.network.utils.NetworkResponse import com.wire.kalium.network.utils.handleUnsuccessfulResponse import com.wire.kalium.network.utils.mapSuccess @@ -43,7 +42,6 @@ import io.ktor.client.request.parameter import io.ktor.client.request.post import io.ktor.client.request.preparePost import io.ktor.client.request.setBody -import io.ktor.utils.io.errors.IOException internal open class ConversationApiV4 internal constructor( authenticatedNetworkClient: AuthenticatedNetworkClient, @@ -88,15 +86,16 @@ internal open class ConversationApiV4 internal constructor( override suspend fun addMember( addParticipantRequest: AddConversationMembersRequest, conversationId: ConversationId - ): NetworkResponse = try { - httpClient.post("$PATH_CONVERSATIONS/${conversationId.domain}/${conversationId.value}/$PATH_MEMBERS") { - setBody(addParticipantRequest) - }.let { response -> - wrapFederationResponse(response) { handleConversationMemberAddedResponse(response) } + ): NetworkResponse = wrapKaliumResponse( + performRequest = { + httpClient.post("$PATH_CONVERSATIONS/${conversationId.domain}/${conversationId.value}/$PATH_MEMBERS") { + setBody(addParticipantRequest) + } + }, + unsuccessfulResponseOverride = { + wrapFederationResponse(it) { handleConversationMemberAddedResponse(it) } } - } catch (e: IOException) { - NetworkResponse.Error(KaliumException.GenericError(e)) - } + ) override suspend fun generateGuestRoomLink( conversationId: ConversationId, diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/utils/NetworkUtils.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/utils/NetworkUtils.kt index 042aaebb36c..21d8faaa31e 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/utils/NetworkUtils.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/utils/NetworkUtils.kt @@ -24,15 +24,20 @@ import com.wire.kalium.network.api.base.model.FederationConflictResponse import com.wire.kalium.network.api.base.model.FederationUnreachableResponse import com.wire.kalium.network.exceptions.KaliumException import com.wire.kalium.network.kaliumLogger +import com.wire.kalium.network.tools.KtxSerializer import io.ktor.client.call.NoTransformationFoundException import io.ktor.client.call.body import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.statement.HttpResponse +import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.ktor.http.URLProtocol import io.ktor.http.Url import io.ktor.http.isSuccess +import io.ktor.serialization.ContentConvertException import io.ktor.serialization.JsonConvertException +import kotlinx.serialization.MissingFieldException +import kotlinx.serialization.SerializationException internal fun HttpRequestBuilder.setWSSUrl(baseUrl: Url, vararg path: String) { url { @@ -282,17 +287,21 @@ suspend fun wrapFederationResponse( * i.e.: '/commit-bundles' 409 for "mls-stale-message" and 409 for "federation-conflict" */ private suspend fun resolveStatusCodeBasedFirstOrFederated(response: HttpResponse): NetworkResponse.Error { + val responseString = response.bodyAsText() + val kaliumException = try { - val errorResponse = response.body() + val errorResponse = KtxSerializer.json.decodeFromString(responseString) + toStatusCodeBasedKaliumException( response.status, response, errorResponse ) - } catch (exception: JsonConvertException) { + } catch (exception: SerializationException) { try { - KaliumException.FederationConflictException(response.body()) - } catch (_: NoTransformationFoundException) { + val federationConflictResponse = KtxSerializer.json.decodeFromString(responseString) + KaliumException.FederationConflictException(federationConflictResponse) + } catch (_: SerializationException) { KaliumException.FederationConflictException(FederationConflictResponse(emptyList())) } }