Add retry policy to MediaDownloader to accommodate short network outages during download (#404)

pull/411/head
Andrew Kolos 4 years ago committed by GitHub
parent ddb4856516
commit 09acfcff59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using DiscordChatExporter.Domain.Internal;
using DiscordChatExporter.Domain.Internal.Extensions;
using Polly;
using Polly.Retry;
namespace DiscordChatExporter.Domain.Exporting
{
@ -13,27 +16,35 @@ namespace DiscordChatExporter.Domain.Exporting
{
private readonly HttpClient _httpClient = Singleton.HttpClient;
private readonly string _workingDirPath;
private readonly AsyncRetryPolicy _httpRequestPolicy;
private readonly Dictionary<string, string> _pathMap = new Dictionary<string, string>();
public MediaDownloader(string workingDirPath)
{
_workingDirPath = workingDirPath;
_httpRequestPolicy = Policy
.Handle<IOException>()
.WaitAndRetryAsync(8, i => TimeSpan.FromSeconds(0.5 * i));
}
public async ValueTask<string> DownloadAsync(string url)
{
if (_pathMap.TryGetValue(url, out var cachedFilePath))
return cachedFilePath;
return await _httpRequestPolicy.ExecuteAsync(async () =>
{
if (_pathMap.TryGetValue(url, out var cachedFilePath))
return cachedFilePath;
var fileName = GetFileNameFromUrl(url);
var filePath = PathEx.MakeUniqueFilePath(Path.Combine(_workingDirPath, fileName));
var fileName = GetFileNameFromUrl(url);
var filePath = PathEx.MakeUniqueFilePath(Path.Combine(_workingDirPath, fileName));
Directory.CreateDirectory(_workingDirPath);
Directory.CreateDirectory(_workingDirPath);
await _httpClient.DownloadAsync(url, filePath);
await _httpClient.DownloadAsync(url, filePath);
return _pathMap[url] = filePath;
return _pathMap[url] = filePath;
});
}
}

Loading…
Cancel
Save