#nullable enable
using AngleSharp.Html.Parser;
using Bit.Icons.Extensions;
using Bit.Icons.Models;
namespace Bit.Icons.Services;
public class IconFetchingService : IIconFetchingService
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger _logger;
private readonly IHtmlParser _parser;
private readonly IUriService _uriService;
public IconFetchingService(ILogger logger, IHttpClientFactory httpClientFactory, IHtmlParser parser, IUriService uriService)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
_parser = parser;
_uriService = uriService;
}
public async Task GetIconAsync(string domain)
{
var domainIcons = await DomainIcons.FetchAsync(domain, _logger, _httpClientFactory, _parser, _uriService);
var result = domainIcons.Where(result => result != null).FirstOrDefault();
return result ?? await GetFaviconAsync(domain);
}
private async Task GetFaviconAsync(string domain)
{
// Fall back to favicon
var faviconUriBuilder = new UriBuilder
{
Scheme = "https",
Host = domain,
Path = "/favicon.ico"
};
if (faviconUriBuilder.TryBuild(out var faviconUri))
{
return await new IconLink(faviconUri!).FetchAsync(_logger, _httpClientFactory, _uriService);
}
return null;
}
}