AngleSharp by AngleSharp

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

 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 IDownload _download; private IResourceLoader _loader; public IDownload Download => _download; public BaseRequestProcessor(IResourceLoader loader) { _loader = loader; } public virtual Task Process(ResourceRequest request) { if (IsDifferentToCurrentDownloadUrl(request.Target)) { StartDownload(request); return FinishDownloadAsync(); } return null; } protected abstract Task ProcessResponse(IResponse response); protected void StartDownload(ResourceRequest request) { if (_download != null && !_download.IsCompleted) _download.Cancel(); _download = _loader.DownloadAsync(request); } protected async Task FinishDownloadAsync() { IResponse response = await _download.Task.ConfigureAwait(false); EventTarget eventTarget = _download.Originator as EventTarget; string eventName = EventNames.Error; if (response != null) try { int num = default(int); int num2 = num; try { await ProcessResponse(response).ConfigureAwait(false); eventName = EventNames.Load; } catch (Exception) { } } finally { response.Dispose(); } if (eventTarget != null) eventTarget.FireSimpleEvent(eventName, false, false); } private bool IsDifferentToCurrentDownloadUrl(Url target) { if (_download != null) return !target.Equals(_download.Target); return true; } } }