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 e592ace6c5..e4e0d1a21d 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 @@ -1333,10 +1333,10 @@ object BackupRepository { } } - fun getResumableMessagesBackupUploadSpec(): NetworkResult { + fun getResumableMessagesBackupUploadSpec(backupFileSize: Long): NetworkResult { return initBackupAndFetchAuth() .then { credential -> - SignalNetwork.archive.getMessageBackupUploadForm(SignalStore.account.requireAci(), credential.messageBackupAccess) + SignalNetwork.archive.getMessageBackupUploadForm(SignalStore.account.requireAci(), credential.messageBackupAccess, backupFileSize) .also { Log.i(TAG, "UploadFormResult: ${it::class.simpleName}") } } .then { form -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt index 10191be655..75b1ec1376 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt @@ -158,7 +158,7 @@ class BackupMessagesJob private constructor( this.syncTime = currentTime this.dataFile = tempBackupFile.path - val backupSpec: ResumableMessagesBackupUploadSpec = resumableMessagesBackupUploadSpec ?: when (val result = BackupRepository.getResumableMessagesBackupUploadSpec()) { + val backupSpec: ResumableMessagesBackupUploadSpec = resumableMessagesBackupUploadSpec ?: when (val result = BackupRepository.getResumableMessagesBackupUploadSpec(tempBackupFile.length())) { is NetworkResult.Success -> { Log.i(TAG, "Successfully generated a new upload spec.") @@ -173,7 +173,15 @@ class BackupMessagesJob private constructor( } is NetworkResult.StatusCodeError -> { - Log.i(TAG, "Status code failure", result.getCause()) + when (result.code) { + 413 -> { + Log.i(TAG, "Backup file is too large! Size: ${tempBackupFile.length()} bytes", result.getCause()) + // TODO [backup] Need to show the user an error + } + else -> { + Log.i(TAG, "Status code failure", result.getCause()) + } + } return Result.retry(defaultBackoff()) } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt index 00572c5d0b..21da07108b 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt @@ -143,13 +143,14 @@ class ArchiveApi( * - 200: Success * - 400: Bad args, or made on an authenticated channel * - 403: Insufficient permissions + * - 413: The backup is too large * - 429: Rate-limited */ - fun getMessageBackupUploadForm(aci: ACI, archiveServiceAccess: ArchiveServiceAccess): NetworkResult { + fun getMessageBackupUploadForm(aci: ACI, archiveServiceAccess: ArchiveServiceAccess, backupFileSize: Long): NetworkResult { return getCredentialPresentation(aci, archiveServiceAccess) .map { it.toArchiveCredentialPresentation().toHeaders() } .then { headers -> - val request = WebSocketRequestMessage.get("/v1/archives/upload/form", headers) + val request = WebSocketRequestMessage.get("/v1/archives/upload/form?uploadLength=$backupFileSize", headers) NetworkResult.fromWebSocketRequest(unauthWebSocket, request, AttachmentUploadForm::class) } }