diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index 74553ce711..078649b7ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -1466,7 +1466,7 @@ object BackupRepository { */ private fun initBackupAndFetchAuth(): NetworkResult { return if (!RemoteConfig.messageBackups) { - NetworkResult.StatusCodeError(555, null, null, NonSuccessfulResponseCodeException(555, "Backups disabled!")) + NetworkResult.StatusCodeError(555, null, null, emptyMap(), NonSuccessfulResponseCodeException(555, "Backups disabled!")) } else if (SignalStore.backup.backupsInitialized) { getArchiveServiceAccessPair().runOnStatusCodeError(resetInitializedStateErrorAction) } else if (isPreRestoreDuringRegistration()) { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/NetworkResult.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/NetworkResult.kt index 51bc3f8696..3327c42ac7 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/NetworkResult.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/NetworkResult.kt @@ -22,7 +22,7 @@ import kotlin.reflect.KClass import kotlin.reflect.cast import kotlin.time.Duration -typealias StatusCodeErrorAction = (NetworkResult.StatusCodeError<*>) -> Unit +typealias StatusCodeErrorAction = (StatusCodeError<*>) -> Unit /** * A helper class that wraps the result of a network request, turning common exceptions @@ -171,8 +171,8 @@ sealed class NetworkResult( data class NetworkError(val exception: IOException) : NetworkResult() /** Indicates we got a response, but it was a non-2xx response. */ - data class StatusCodeError(val code: Int, val stringBody: String?, val binaryBody: ByteArray?, val exception: NonSuccessfulResponseCodeException) : NetworkResult() { - constructor(e: NonSuccessfulResponseCodeException) : this(e.code, e.stringBody, e.binaryBody, e) + data class StatusCodeError(val code: Int, val stringBody: String?, val binaryBody: ByteArray?, val headers: Map, val exception: NonSuccessfulResponseCodeException) : NetworkResult() { + constructor(e: NonSuccessfulResponseCodeException) : this(e.code, e.stringBody, e.binaryBody, e.headers, e) inline fun parseJsonBody(): T? { return try { @@ -244,7 +244,7 @@ sealed class NetworkResult( is NetworkError -> NetworkError(exception).runOnStatusCodeError(statusCodeErrorActions) is ApplicationError -> ApplicationError(throwable).runOnStatusCodeError(statusCodeErrorActions) - is StatusCodeError -> StatusCodeError(code, stringBody, binaryBody, exception).runOnStatusCodeError(statusCodeErrorActions) + is StatusCodeError -> StatusCodeError(code, stringBody, binaryBody, headers, exception).runOnStatusCodeError(statusCodeErrorActions) } } @@ -266,7 +266,7 @@ sealed class NetworkResult( is Success -> result(this.result).runOnStatusCodeError(statusCodeErrorActions) is NetworkError -> NetworkError(exception).runOnStatusCodeError(statusCodeErrorActions) is ApplicationError -> ApplicationError(throwable).runOnStatusCodeError(statusCodeErrorActions) - is StatusCodeError -> StatusCodeError(code, stringBody, binaryBody, exception).runOnStatusCodeError(statusCodeErrorActions) + is StatusCodeError -> StatusCodeError(code, stringBody, binaryBody, headers, exception).runOnStatusCodeError(statusCodeErrorActions) } } @@ -354,7 +354,7 @@ sealed class NetworkResult( } private fun WebsocketResponse.toStatusCodeError(): NetworkResult { - return StatusCodeError(NonSuccessfulResponseCodeException(this.status, "", this.body)) + return StatusCodeError(NonSuccessfulResponseCodeException(this.status, "", this.body, this.headers)) } private fun WebsocketResponse.toSuccess(responseJsonClass: KClass): NetworkResult { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException.kt index 8fcb608635..d5b3a5d8c1 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException.kt @@ -15,29 +15,36 @@ open class NonSuccessfulResponseCodeException : IOException { val code: Int val stringBody: String? val binaryBody: ByteArray? + val headers: Map constructor(code: Int) : super("StatusCode: $code") { this.code = code this.stringBody = null this.binaryBody = null + this.headers = emptyMap() } constructor(code: Int, message: String) : super("[$code] $message") { this.code = code this.stringBody = null this.binaryBody = null + this.headers = emptyMap() } - constructor(code: Int, message: String, body: String?) : super("[$code] $message") { + @JvmOverloads + constructor(code: Int, message: String, body: String?, headers: Map = emptyMap()) : super("[$code] $message") { this.code = code this.stringBody = body this.binaryBody = null + this.headers = headers.mapKeys { it.key.lowercase() } } - constructor(code: Int, message: String, body: ByteArray?) : super("[$code] $message") { + @JvmOverloads + constructor(code: Int, message: String, body: ByteArray?, headers: Map = emptyMap()) : super("[$code] $message") { this.code = code this.stringBody = null this.binaryBody = body + this.headers = headers.mapKeys { it.key.lowercase() } } fun is4xx(): Boolean { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebsocketResponse.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebsocketResponse.java index baef42b4bc..5fcb14728e 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebsocketResponse.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebsocketResponse.java @@ -38,6 +38,10 @@ public class WebsocketResponse { return headers.get(Preconditions.checkNotNull(key.toLowerCase())); } + public Map getHeaders() { + return headers; + } + public boolean isUnidentified() { return unidentified; }