From 1e3705978ed5ed34302b7f0f3f2641835dad72db Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 25 Aug 2020 14:33:38 +1000 Subject: [PATCH] Retry failed attachment downloads --- .../Attachments/OWSAttachmentDownloads.m | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentDownloads.m b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentDownloads.m index 60f50cbc4..fb850789b 100644 --- a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentDownloads.m +++ b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentDownloads.m @@ -378,19 +378,30 @@ typedef void (^AttachmentDownloadFailure)(NSError *error); }); }; - dispatch_async([OWSDispatch attachmentsQueue], ^{ - [self downloadFromLocation:attachmentPointer.downloadURL - job:job - success:^(NSString *encryptedDataFilePath) { - [self decryptAttachmentPath:encryptedDataFilePath - attachmentPointer:attachmentPointer - success:markAndHandleSuccess - failure:markAndHandleFailure]; - } - failure:^(NSURLSessionTask *_Nullable task, NSError *error) { - markAndHandleFailure(error); - }]; - }); + __block NSUInteger retryCount = 0; + NSUInteger maxRetryCount = 4; + __block void (^attempt)(); + attempt = ^() { + dispatch_async([OWSDispatch attachmentsQueue], ^{ + [self downloadFromLocation:attachmentPointer.downloadURL + job:job + success:^(NSString *encryptedDataFilePath) { + [self decryptAttachmentPath:encryptedDataFilePath + attachmentPointer:attachmentPointer + success:markAndHandleSuccess + failure:markAndHandleFailure]; + } + failure:^(NSURLSessionTask *task, NSError *error) { + if (retryCount == maxRetryCount) { + markAndHandleFailure(error); + } else { + retryCount += 1; + attempt(); + } + }]; + }); + }; + attempt(); } - (void)decryptAttachmentPath:(NSString *)encryptedDataFilePath @@ -630,6 +641,7 @@ typedef void (^AttachmentDownloadFailure)(NSError *error); } successHandler(tempFilePath); }]; + [task resume]; }