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;
}
}
}