LenovoLegionToolkit
29 строк · 1.2 Кб
1using System;2using System.IO;3using System.Net.Http;4using System.Threading;5using System.Threading.Tasks;6
7namespace LenovoLegionToolkit.Lib.Extensions;8
9public static class HttpClientExtensions10{
11public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress<float>? progress = null, CancellationToken cancellationToken = default)12{13using var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);14var contentLength = response.Content.Headers.ContentLength;15
16await using var download = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);17
18if (progress is null || !contentLength.HasValue)19{20await download.CopyToAsync(destination, cancellationToken).ConfigureAwait(false);21return;22}23
24progress.Report(0);25var relativeProgress = new Progress<long>(totalBytes => progress.Report((float)totalBytes / contentLength.Value));26await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken).ConfigureAwait(false);27progress.Report(1);28}29}
30