aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-06-23 13:06:32 +0200
committerFlorian Dold <florian@dold.me>2021-06-23 13:06:32 +0200
commit3603a6866977600e9cb16f5e94488fde9cfb02a5 (patch)
treeeb0b492902efd1d25902bc0dad68334ac4ff854f
parenteaced5ca63f209ee3cab6bbf2339642e6f434ce6 (diff)
sync: handle HTTP 304 correctly
-rw-r--r--packages/taler-wallet-core/src/db.ts9
-rw-r--r--packages/taler-wallet-core/src/operations/backup/index.ts23
2 files changed, 27 insertions, 5 deletions
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);
}