Add CancellationToken to HttpClient async methods

This commit is contained in:
Bogdan 2026-04-28 18:05:46 +03:00
parent beab42841e
commit 7daa508327
18 changed files with 71 additions and 55 deletions

View file

@ -1,10 +1,11 @@
using System.Net;
using System.Threading;
using System.Threading.Tasks;
namespace NzbDrone.Common.Http.Dispatchers
{
public interface IHttpDispatcher
{
Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieContainer cookies);
Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieContainer cookies, CancellationToken cancellationToken = default);
}
}

View file

@ -44,7 +44,7 @@ public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider,
_httpHappyEyeballs = new HttpHappyEyeballs(logger);
}
public async Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieContainer cookies)
public async Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieContainer cookies, CancellationToken cancellationToken = default)
{
using var requestMessage = new HttpRequestMessage(request.Method, (Uri)request.Url);
requestMessage.Version = HttpVersion.Version20;
@ -58,7 +58,8 @@ public async Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieCont
requestMessage.Headers.Add("Cookie", cookieHeader);
}
using var cts = new CancellationTokenSource();
using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
if (request.RequestTimeout != TimeSpan.Zero)
{
cts.CancelAfter(request.RequestTimeout);

View file

@ -5,6 +5,7 @@
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using NzbDrone.Common.Cache;
@ -27,14 +28,14 @@ HttpResponse<T> Get<T>(HttpRequest request)
HttpResponse<T> Post<T>(HttpRequest request)
where T : new();
Task<HttpResponse> ExecuteAsync(HttpRequest request);
Task DownloadFileAsync(string url, string fileName);
Task<HttpResponse> GetAsync(HttpRequest request);
Task<HttpResponse<T>> GetAsync<T>(HttpRequest request)
Task<HttpResponse> ExecuteAsync(HttpRequest request, CancellationToken cancellationToken = default);
Task DownloadFileAsync(string url, string fileName, CancellationToken cancellationToken = default);
Task<HttpResponse> GetAsync(HttpRequest request, CancellationToken cancellationToken = default);
Task<HttpResponse<T>> GetAsync<T>(HttpRequest request, CancellationToken cancellationToken = default)
where T : new();
Task<HttpResponse> HeadAsync(HttpRequest request);
Task<HttpResponse> PostAsync(HttpRequest request);
Task<HttpResponse<T>> PostAsync<T>(HttpRequest request)
Task<HttpResponse> HeadAsync(HttpRequest request, CancellationToken cancellationToken = default);
Task<HttpResponse> PostAsync(HttpRequest request, CancellationToken cancellationToken = default);
Task<HttpResponse<T>> PostAsync<T>(HttpRequest request, CancellationToken cancellationToken = default)
where T : new();
}
@ -62,11 +63,11 @@ public HttpClient(IEnumerable<IHttpRequestInterceptor> requestInterceptors,
_cookieContainerCache = cacheManager.GetCache<CookieContainer>(typeof(HttpClient));
}
public virtual async Task<HttpResponse> ExecuteAsync(HttpRequest request)
public virtual async Task<HttpResponse> ExecuteAsync(HttpRequest request, CancellationToken cancellationToken = default)
{
var cookieContainer = InitializeRequestCookies(request);
var response = await ExecuteRequestAsync(request, cookieContainer);
var response = await ExecuteRequestAsync(request, cookieContainer, cancellationToken);
if (request.AllowAutoRedirect && response.HasHttpRedirect)
{
@ -92,7 +93,7 @@ public virtual async Task<HttpResponse> ExecuteAsync(HttpRequest request)
request.ContentSummary = null;
}
response = await ExecuteRequestAsync(request, cookieContainer);
response = await ExecuteRequestAsync(request, cookieContainer, cancellationToken);
}
while (response.HasHttpRedirect);
}
@ -137,7 +138,7 @@ private static bool RequestRequiresForceGet(HttpStatusCode statusCode, HttpMetho
};
}
private async Task<HttpResponse> ExecuteRequestAsync(HttpRequest request, CookieContainer cookieContainer)
private async Task<HttpResponse> ExecuteRequestAsync(HttpRequest request, CookieContainer cookieContainer, CancellationToken cancellationToken = default)
{
foreach (var interceptor in _requestInterceptors)
{
@ -153,7 +154,7 @@ private async Task<HttpResponse> ExecuteRequestAsync(HttpRequest request, Cookie
var stopWatch = Stopwatch.StartNew();
var response = await _httpDispatcher.GetResponseAsync(request, cookieContainer);
var response = await _httpDispatcher.GetResponseAsync(request, cookieContainer, cancellationToken);
HandleResponseCookies(response, cookieContainer);
@ -261,7 +262,7 @@ private void AddCookiesToContainer(HttpUri url, string[] cookieHeaders, CookieCo
}
}
public async Task DownloadFileAsync(string url, string fileName)
public async Task DownloadFileAsync(string url, string fileName, CancellationToken cancellationToken = default)
{
var fileNamePart = fileName + ".part";
@ -282,7 +283,7 @@ public async Task DownloadFileAsync(string url, string fileName)
request.AllowAutoRedirect = true;
request.ResponseStream = fileStream;
request.RequestTimeout = TimeSpan.FromSeconds(300);
var response = await GetAsync(request);
var response = await GetAsync(request, cancellationToken);
if (response.Headers.ContentType != null && response.Headers.ContentType.Contains("text/html"))
{
@ -315,10 +316,10 @@ public void DownloadFile(string url, string fileName)
Task.Run(() => DownloadFileAsync(url, fileName)).GetAwaiter().GetResult();
}
public Task<HttpResponse> GetAsync(HttpRequest request)
public Task<HttpResponse> GetAsync(HttpRequest request, CancellationToken cancellationToken = default)
{
request.Method = HttpMethod.Get;
return ExecuteAsync(request);
return ExecuteAsync(request, cancellationToken);
}
public HttpResponse Get(HttpRequest request)
@ -326,10 +327,10 @@ public HttpResponse Get(HttpRequest request)
return Task.Run(() => GetAsync(request)).GetAwaiter().GetResult();
}
public async Task<HttpResponse<T>> GetAsync<T>(HttpRequest request)
public async Task<HttpResponse<T>> GetAsync<T>(HttpRequest request, CancellationToken cancellationToken = default)
where T : new()
{
var response = await GetAsync(request);
var response = await GetAsync(request, cancellationToken);
CheckResponseContentType(response);
return new HttpResponse<T>(response);
}
@ -340,10 +341,10 @@ public HttpResponse<T> Get<T>(HttpRequest request)
return Task.Run(() => GetAsync<T>(request)).GetAwaiter().GetResult();
}
public Task<HttpResponse> HeadAsync(HttpRequest request)
public Task<HttpResponse> HeadAsync(HttpRequest request, CancellationToken cancellationToken = default)
{
request.Method = HttpMethod.Head;
return ExecuteAsync(request);
return ExecuteAsync(request, cancellationToken);
}
public HttpResponse Head(HttpRequest request)
@ -351,10 +352,10 @@ public HttpResponse Head(HttpRequest request)
return Task.Run(() => HeadAsync(request)).GetAwaiter().GetResult();
}
public Task<HttpResponse> PostAsync(HttpRequest request)
public Task<HttpResponse> PostAsync(HttpRequest request, CancellationToken cancellationToken = default)
{
request.Method = HttpMethod.Post;
return ExecuteAsync(request);
return ExecuteAsync(request, cancellationToken);
}
public HttpResponse Post(HttpRequest request)
@ -362,10 +363,10 @@ public HttpResponse Post(HttpRequest request)
return Task.Run(() => PostAsync(request)).GetAwaiter().GetResult();
}
public async Task<HttpResponse<T>> PostAsync<T>(HttpRequest request)
public async Task<HttpResponse<T>> PostAsync<T>(HttpRequest request, CancellationToken cancellationToken = default)
where T : new()
{
var response = await PostAsync(request);
var response = await PostAsync(request, cancellationToken);
CheckResponseContentType(response);
return new HttpResponse<T>(response);
}

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -39,7 +40,7 @@ public void SetupBase()
Mocker.GetMock<IHttpClient>()
.Setup(s => s.GetAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>())));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>())));
Mocker.GetMock<IRemotePathMappingService>()
.Setup(v => v.RemapRemoteToLocal(It.IsAny<string>(), It.IsAny<OsPath>()))

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -105,7 +106,7 @@ protected void GivenSuccessfulDownload()
{
Mocker.GetMock<IHttpClient>()
.Setup(s => s.GetAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), new byte[1000])));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), new byte[1000])));
Mocker.GetMock<IHadoukenProxy>()
.Setup(s => s.AddTorrentUri(It.IsAny<HadoukenSettings>(), It.IsAny<string>()))

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -34,7 +35,7 @@ public async Task should_parse_recent_feed_from_BroadcastheNet()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Post)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -79,7 +80,7 @@ public async Task should_back_off_on_bad_request()
{
Mocker.GetMock<IHttpClient>()
.Setup(v => v.ExecuteAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.BadRequest)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.BadRequest)));
var results = await Subject.FetchRecent();
@ -95,7 +96,7 @@ public async Task should_back_off_and_report_api_key_invalid()
{
Mocker.GetMock<IHttpClient>()
.Setup(v => v.ExecuteAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.Unauthorized)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.Unauthorized)));
var results = await Subject.FetchRecent();
@ -111,7 +112,7 @@ public async Task should_back_off_on_unknown_method()
{
Mocker.GetMock<IHttpClient>()
.Setup(v => v.ExecuteAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.NotFound)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.NotFound)));
var results = await Subject.FetchRecent();
@ -127,7 +128,7 @@ public async Task should_back_off_api_limit_reached()
{
Mocker.GetMock<IHttpClient>()
.Setup(v => v.ExecuteAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.ServiceUnavailable)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty<byte>(), System.Net.HttpStatusCode.ServiceUnavailable)));
var results = await Subject.FetchRecent();
@ -149,7 +150,7 @@ public async Task should_replace_https_http_as_needed()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Post)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -32,7 +33,7 @@ public async Task should_parse_recent_feed_from_fanzub()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -33,7 +34,7 @@ public async Task should_parse_recent_feed_from_FileList()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, recentFeed)));
var releases = await Subject.FetchRecent();

View file

@ -2,6 +2,7 @@
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -37,7 +38,7 @@ public async Task should_parse_recent_feed_from_HDBits(string fileName)
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Post)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), responseJson)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), responseJson)));
var torrents = await Subject.FetchRecent();
@ -66,7 +67,7 @@ public async Task should_warn_on_wrong_passkey()
Mocker.GetMock<IHttpClient>()
.Setup(v => v.ExecuteAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Encoding.UTF8.GetBytes(responseJson))));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), Encoding.UTF8.GetBytes(responseJson))));
var torrents = await Subject.FetchRecent();

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -91,7 +92,7 @@ public async Task should_parse_recent_feed_from_IPTorrents()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();

View file

@ -2,6 +2,7 @@
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using DryIoc.ImTools;
using FluentAssertions;
@ -49,7 +50,7 @@ public async Task should_parse_recent_feed_from_newznab_nzb_su()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -75,7 +76,7 @@ public async Task should_parse_recent_feed_from_newznab_animetosho()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -145,7 +146,7 @@ public async Task should_parse_languages()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -173,7 +174,7 @@ public async Task should_parse_indexer_flags(string releaseGuid, params IndexerF
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), feed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), feed)));
var releases = await Subject.FetchRecent();

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -65,7 +66,7 @@ public async Task should_parse_2021_recent_feed_from_Nyaa()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();

View file

@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FizzWare.NBuilder;
using Moq;
@ -25,7 +26,7 @@ public void Setup()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), "<xml></xml>")));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), "<xml></xml>")));
}
private void WithIndexer(bool paging, int resultCount)

View file

@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -37,7 +38,7 @@ private void GivenRecentFeedResponse(string rssXmlFile)
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.IsAny<HttpRequest>()))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.IsAny<HttpRequest>()))

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using Moq;
@ -33,7 +34,7 @@ public async Task should_parse_recent_feed_from_Torrentleech()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();

View file

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FizzWare.NBuilder;
using FluentAssertions;
@ -51,7 +52,7 @@ public async Task should_parse_recent_feed_from_torznab_hdaccess_net()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -82,7 +83,7 @@ public async Task should_parse_recent_feed_from_torznab_tpb()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -112,7 +113,7 @@ public async Task should_parse_recent_feed_from_torznab_animetosho()
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var releases = await Subject.FetchRecent();
@ -175,7 +176,7 @@ public void jackett_all_url_should_not_validate(string baseUrl)
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
var result = new NzbDroneValidationResult(Subject.Test());
result.IsValid.Should().BeTrue();
@ -190,7 +191,7 @@ public void jackett_all_api_should_not_validate(string apiPath)
Mocker.GetMock<IHttpClient>()
.Setup(o => o.ExecuteAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
.Returns<HttpRequest>(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
.Returns<HttpRequest, CancellationToken>((r, _) => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed)));
(Subject.Definition.Settings as TorznabSettings).ApiPath = apiPath;

View file

@ -140,7 +140,7 @@ private async Task<string> DownloadFromWebUrl(RemoteEpisode remoteEpisode, IInde
request.AllowAutoRedirect = false;
var response = await RetryStrategy
.ExecuteAsync(static async (state, _) => await state._httpClient.GetAsync(state.request), (_httpClient, request))
.ExecuteAsync(static async (state, token) => await state._httpClient.GetAsync(state.request, token), (_httpClient, request))
.ConfigureAwait(false);
if (response.StatusCode == HttpStatusCode.MovedPermanently ||

View file

@ -51,7 +51,7 @@ public override async Task<string> Download(RemoteEpisode remoteEpisode, IIndexe
request.AllowAutoRedirect = true;
var response = await RetryStrategy
.ExecuteAsync(static async (state, _) => await state._httpClient.GetAsync(state.request), (_httpClient, request))
.ExecuteAsync(static async (state, token) => await state._httpClient.GetAsync(state.request, token), (_httpClient, request))
.ConfigureAwait(false);
nzbData = response.ResponseData;