Add FollowRedirects option to downloader
Introduces a FollowRedirects property to UnitDownloaderOptions and its builder, allowing control over HTTP redirect behavior. Updates UnitDownloader to use this option, following redirects when enabled and reporting progress accordingly.
This commit is contained in:
@@ -25,8 +25,17 @@ namespace Beam.Downloaders {
|
||||
|
||||
protected virtual async Task DownloadToStream(string url, int bufferSize, Stream destinationStream, IProgress<IDownloadReport> progress,
|
||||
CancellationToken ct) {
|
||||
if (options.FollowRedirects) {
|
||||
var response = await Client.GetAsync(url, ct); // automatically follows redirects
|
||||
await response.Content.CopyToAsync(destinationStream, ct);
|
||||
progress?.Report(new DownloadReport() {
|
||||
BytesDownloaded = destinationStream.Length,
|
||||
BytesRemaining = 0
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var stream = await Client.GetStreamAsync(url, ct);
|
||||
var stream = await Client.GetStreamAsync(url, ct); // does not follow redirects
|
||||
byte[] buffer = new byte[bufferSize];
|
||||
int inBuffer = 0;
|
||||
long downloaded = 0;
|
||||
|
||||
@@ -24,6 +24,8 @@ public record class UnitDownloaderOptions<OutType> {
|
||||
public string? DownloadFolder { get; init; } = null;
|
||||
public int BufferSize { get; init; } = 80 * 1024; // 80kb
|
||||
|
||||
public bool FollowRedirects { get; init; } = true;
|
||||
|
||||
public string GetFileNameForDownload(string url, byte[] additionalData) {
|
||||
byte[] bytes = [..Encoding.UTF8.GetBytes(url), ..additionalData];
|
||||
var name = Convert.ToBase64String(System.IO.Hashing.XxHash64.Hash(bytes));
|
||||
|
||||
@@ -13,12 +13,18 @@ public sealed class UnitDownloaderOptionsBuilder<OutType> {
|
||||
private AsyncTransformer<ByteDocument, OutType>? _asyncTransformer;
|
||||
private string? _downloadFolder = null;
|
||||
private int _bufferSize = 80 * 1024;
|
||||
private bool _followRedirects = true;
|
||||
|
||||
public UnitDownloaderOptionsBuilder<OutType> WithTarget(DownloadTarget target) {
|
||||
_target = target;
|
||||
return this;
|
||||
}
|
||||
|
||||
public UnitDownloaderOptionsBuilder<OutType> WithFollowRedirects(bool followRedirects) {
|
||||
_followRedirects = followRedirects;
|
||||
return this;
|
||||
}
|
||||
|
||||
public UnitDownloaderOptionsBuilder<OutType> WithClient(HttpClient client)
|
||||
{
|
||||
_client = client ?? throw new System.ArgumentNullException(nameof(client));
|
||||
@@ -98,6 +104,7 @@ public sealed class UnitDownloaderOptionsBuilder<OutType> {
|
||||
Client = _client,
|
||||
FailurePredicateOptions = _failurePredicateOptionsOverride,
|
||||
SkipPredicateOptions = _skipPredicateOptionsOverride,
|
||||
FollowRedirects = _followRedirects,
|
||||
FragmentOptions = _fragmentOptions,
|
||||
AsyncTransformer = _asyncTransformer,
|
||||
DownloadFolder = _downloadFolder,
|
||||
|
||||
Reference in New Issue
Block a user