Ensure that when no Matrix gateway exists, the default one is used.
This commit is contained in:
parent
55a5d45d4f
commit
70326d9dc5
5 changed files with 51 additions and 20 deletions
|
|
@ -12,12 +12,21 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
|||
import io.element.android.libraries.core.data.tryOrNull
|
||||
import io.element.android.libraries.di.AppScope
|
||||
import kotlinx.coroutines.withContext
|
||||
import retrofit2.HttpException
|
||||
import timber.log.Timber
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
import javax.inject.Inject
|
||||
|
||||
sealed interface UnifiedPushGatewayResolverResult {
|
||||
data class Success(val gateway: String) : UnifiedPushGatewayResolverResult
|
||||
data class Error(val gateway: String) : UnifiedPushGatewayResolverResult
|
||||
data object NoMatrixGateway : UnifiedPushGatewayResolverResult
|
||||
data object ErrorInvalidUrl : UnifiedPushGatewayResolverResult
|
||||
}
|
||||
|
||||
interface UnifiedPushGatewayResolver {
|
||||
suspend fun getGateway(endpoint: String): String
|
||||
suspend fun getGateway(endpoint: String): UnifiedPushGatewayResolverResult
|
||||
}
|
||||
|
||||
@ContributesBinding(AppScope::class)
|
||||
|
|
@ -27,7 +36,7 @@ class DefaultUnifiedPushGatewayResolver @Inject constructor(
|
|||
) : UnifiedPushGatewayResolver {
|
||||
private val logger = Timber.tag("DefaultUnifiedPushGatewayResolver")
|
||||
|
||||
override suspend fun getGateway(endpoint: String): String {
|
||||
override suspend fun getGateway(endpoint: String): UnifiedPushGatewayResolverResult {
|
||||
val url = tryOrNull(
|
||||
onError = { logger.d(it, "Cannot parse endpoint as an URL") }
|
||||
) {
|
||||
|
|
@ -35,7 +44,7 @@ class DefaultUnifiedPushGatewayResolver @Inject constructor(
|
|||
}
|
||||
return if (url == null) {
|
||||
logger.d("Using default gateway")
|
||||
UnifiedPushConfig.DEFAULT_PUSH_GATEWAY_HTTP_URL
|
||||
UnifiedPushGatewayResolverResult.ErrorInvalidUrl
|
||||
} else {
|
||||
val port = if (url.port != -1) ":${url.port}" else ""
|
||||
val customBase = "${url.protocol}://${url.host}$port"
|
||||
|
|
@ -47,14 +56,21 @@ class DefaultUnifiedPushGatewayResolver @Inject constructor(
|
|||
val discoveryResponse = api.discover()
|
||||
if (discoveryResponse.unifiedpush.gateway == "matrix") {
|
||||
logger.d("The endpoint seems to be a valid UnifiedPush gateway")
|
||||
UnifiedPushGatewayResolverResult.Success(customUrl)
|
||||
} else {
|
||||
logger.e("The endpoint does not seem to be a valid UnifiedPush gateway")
|
||||
// The endpoint returned a 200 OK but didn't promote an actual matrix gateway, which means it doesn't have any
|
||||
logger.w("The endpoint does not seem to be a valid UnifiedPush gateway, using fallback")
|
||||
UnifiedPushGatewayResolverResult.NoMatrixGateway
|
||||
}
|
||||
} catch (throwable: Throwable) {
|
||||
logger.e(throwable, "Error checking for UnifiedPush endpoint")
|
||||
if ((throwable as? HttpException)?.code() == HttpURLConnection.HTTP_NOT_FOUND) {
|
||||
logger.i("Checking for UnifiedPush endpoint yielded 404, using fallback")
|
||||
UnifiedPushGatewayResolverResult.NoMatrixGateway
|
||||
} else {
|
||||
logger.e(throwable, "Error checking for UnifiedPush endpoint")
|
||||
UnifiedPushGatewayResolverResult.Error(customUrl)
|
||||
}
|
||||
}
|
||||
// Always return the custom url.
|
||||
customUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,6 +64,21 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() {
|
|||
Timber.tag(loggerTag.value).i("onNewEndpoint: $endpoint")
|
||||
coroutineScope.launch {
|
||||
val gateway = unifiedPushGatewayResolver.getGateway(endpoint)
|
||||
.let { gatewayResult ->
|
||||
when (gatewayResult) {
|
||||
is UnifiedPushGatewayResolverResult.Error -> {
|
||||
// Use previous gateway if any, or the provided one
|
||||
unifiedPushStore.getPushGateway(instance) ?: gatewayResult.gateway
|
||||
}
|
||||
UnifiedPushGatewayResolverResult.ErrorInvalidUrl,
|
||||
UnifiedPushGatewayResolverResult.NoMatrixGateway -> {
|
||||
UnifiedPushConfig.DEFAULT_PUSH_GATEWAY_HTTP_URL
|
||||
}
|
||||
is UnifiedPushGatewayResolverResult.Success -> {
|
||||
gatewayResult.gateway
|
||||
}
|
||||
}
|
||||
}
|
||||
unifiedPushStore.storePushGateway(instance, gateway)
|
||||
val result = newGatewayHandler.handle(endpoint, gateway, instance)
|
||||
.onFailure {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue