From 3603a6866977600e9cb16f5e94488fde9cfb02a5 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 23 Jun 2021 13:06:32 +0200 Subject: sync: handle HTTP 304 correctly --- packages/taler-wallet-core/src/db.ts | 9 ++++++++- .../src/operations/backup/index.ts | 23 ++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) (limited to 'packages') diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts index 36b4e0864..e640e7f20 100644 --- a/packages/taler-wallet-core/src/db.ts +++ b/packages/taler-wallet-core/src/db.ts @@ -1586,7 +1586,14 @@ export interface BackupProviderRecord { */ lastBackupHash?: string; - lastBackupTimestamp?: Timestamp; + /** + * Last time that we successfully uploaded a backup (or + * the uploaded backup was already current). + * + * Does NOT correspond to the timestamp of the backup, + * which only changes when the backup content changes. + */ + lastBackupCycleTimestamp?: Timestamp; /** * Proposal that we're currently trying to pay for. diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts index 0d3cf5786..d367cf66a 100644 --- a/packages/taler-wallet-core/src/operations/backup/index.ts +++ b/packages/taler-wallet-core/src/operations/backup/index.ts @@ -296,6 +296,21 @@ async function runBackupCycleForProvider( logger.trace(`sync response status: ${resp.status}`); + if (resp.status === HttpResponseStatus.NotModified) { + await ws.db + .mktx((x) => ({ backupProvider: x.backupProviders })) + .runReadWrite(async (tx) => { + const prov = await tx.backupProvider.get(provider.baseUrl); + if (!prov) { + return; + } + delete prov.lastError; + prov.lastBackupCycleTimestamp = getTimestampNow(); + await tx.backupProvider.put(prov); + }); + return; + } + if (resp.status === HttpResponseStatus.PaymentRequired) { logger.trace("payment required for backup"); logger.trace(`headers: ${j2s(resp.headers)}`); @@ -360,7 +375,7 @@ async function runBackupCycleForProvider( return; } prov.lastBackupHash = encodeCrock(currentBackupHash); - prov.lastBackupTimestamp = getTimestampNow(); + prov.lastBackupCycleTimestamp = getTimestampNow(); prov.lastError = undefined; await tx.backupProviders.put(prov); }); @@ -382,7 +397,7 @@ async function runBackupCycleForProvider( return; } prov.lastBackupHash = encodeCrock(hash(backupEnc)); - prov.lastBackupTimestamp = getTimestampNow(); + prov.lastBackupCycleTimestamp = getTimestampNow(); prov.lastError = undefined; await tx.backupProvider.put(prov); }); @@ -684,7 +699,7 @@ export async function getBackupInfo( providers.push({ active: x.active, syncProviderBaseUrl: x.baseUrl, - lastSuccessfulBackupTimestamp: x.lastBackupTimestamp, + lastSuccessfulBackupTimestamp: x.lastBackupCycleTimestamp, paymentProposalIds: x.paymentProposalIds, lastError: x.lastError, paymentStatus: await getProviderPaymentInfo(ws, x), @@ -759,7 +774,7 @@ async function backupRecoveryTheirs( } const providers = await tx.backupProviders.iter().toArray(); for (const prov of providers) { - prov.lastBackupTimestamp = undefined; + prov.lastBackupCycleTimestamp = undefined; prov.lastBackupHash = undefined; await tx.backupProviders.put(prov); } -- cgit v1.2.3