mirror of
https://github.com/bitwarden/server
synced 2026-01-02 16:43:25 +00:00
* Rewrite Icon fetching * Move validation to IconUri, Uri, or UriBuilder * `dotnet format` 🤖 * PR suggestions * Add not null compiler hint * Add twitter to test case * Move Uri manipulation to UriService * Implement MockedHttpClient Presents better, fluent handling of message matching and response building. * Add redirect handling tests * Add testing to models * More aggressively dispose content in icon link * Format 🤖 * Update icon lockfile * Convert to cloned stream for HttpResponseBuilder Content was being disposed when HttResponseMessage was being disposed. This avoids losing our reference to our content and allows multiple usages of the same `MockedHttpMessageResponse` * Move services to extension Extension is shared by testing and allows access to services from our service tests * Remove unused `using` * Prefer awaiting asyncs for better exception handling * `dotnet format` 🤖 * Await async * Update tests to use test TLD and ip ranges * Remove unused interfaces * Make assignments static when possible * Prefer invariant comparer to downcasing * Prefer injecting interface services to implementations * Prefer comparer set in HashSet initialization * Allow SVG icons * Filter out icons with unknown formats * Seek to beginning of MemoryStream after writing it * More appropriate to not return icon if it's invalid * Add svg icon test
45 lines
1.9 KiB
C#
45 lines
1.9 KiB
C#
# nullable enable
|
|
|
|
using System.Net;
|
|
using AngleSharp.Html.Parser;
|
|
using Bit.Icons.Services;
|
|
|
|
namespace Bit.Icons.Extensions;
|
|
|
|
public static class ServiceCollectionExtension
|
|
{
|
|
public static void ConfigureHttpClients(this IServiceCollection services)
|
|
{
|
|
services.AddHttpClient("Icons", client =>
|
|
{
|
|
client.Timeout = TimeSpan.FromSeconds(20);
|
|
client.MaxResponseContentBufferSize = 5000000; // 5 MB
|
|
// Let's add some headers to look like we're coming from a web browser request. Some websites
|
|
// will block our request without these.
|
|
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
|
|
"(KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
|
|
client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.8");
|
|
client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
|
|
client.DefaultRequestHeaders.Add("Pragma", "no-cache");
|
|
client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;" +
|
|
"q=0.9,image/webp,image/apng,*/*;q=0.8");
|
|
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
|
|
{
|
|
AllowAutoRedirect = false,
|
|
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
|
|
});
|
|
}
|
|
|
|
public static void AddHtmlParsing(this IServiceCollection services)
|
|
{
|
|
services.AddSingleton<IHtmlParser, HtmlParser>();
|
|
}
|
|
|
|
public static void AddServices(this IServiceCollection services)
|
|
{
|
|
services.AddSingleton<IUriService, UriService>();
|
|
services.AddSingleton<IDomainMappingService, DomainMappingService>();
|
|
services.AddSingleton<IIconFetchingService, IconFetchingService>();
|
|
}
|
|
}
|