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