using System; using System.IO; using System.Net.Http; using System.Threading; using System.Threading.Tasks; namespace Elwig.Helpers { public static class HttpClientExtensions { public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress? progress = null, CancellationToken cancellationToken = default) { using var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead, cancellationToken); var contentLength = response.Content.Headers.ContentLength; using var download = await response.Content.ReadAsStreamAsync(cancellationToken); if (progress == null || !contentLength.HasValue) { await download.CopyToAsync(destination, cancellationToken); return; } var relativeProgress = new Progress(totalBytes => progress.Report((double)totalBytes / contentLength.Value)); await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken); progress.Report(100.0); } } }