AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="0.9.11" />

 BaseRequestProcessor

using AngleSharp.Dom; using AngleSharp.Extensions; using AngleSharp.Html; using System; using System.Threading.Tasks; namespace AngleSharp.Network.RequestProcessors { internal abstract class BaseRequestProcessor : IRequestProcessor { private readonly IResourceLoader _loader; public IDownload Download { get; set; } public BaseRequestProcessor(IResourceLoader loader) { _loader = loader; } public virtual Task ProcessAsync(ResourceRequest request) { if (IsDifferentToCurrentDownloadUrl(request.Target)) { CancelDownload(); Download = _loader.DownloadAsync(request); return FinishDownloadAsync(); } return null; } protected abstract Task ProcessResponseAsync(IResponse response); protected async Task FinishDownloadAsync() { IDownload download = Download; IResponse response = await download.Task.ConfigureAwait(false); EventTarget eventTarget = download.Originator as EventTarget; string eventName = EventNames.Error; if (response != null) try { await ProcessResponseAsync(response).ConfigureAwait(false); eventName = EventNames.Load; } catch (Exception) { } finally { response.Dispose(); } EventTarget eventTarget2 = eventTarget; if (eventTarget2 != null) eventTarget2.FireSimpleEvent(eventName, false, false); } protected void CancelDownload() { IDownload download = Download; if (download != null && !download.IsCompleted) download.Cancel(); } protected bool IsDifferentToCurrentDownloadUrl(Url target) { IDownload download = Download; if (download != null) return !target.Equals(download.Target); return true; } } }