diff --git a/PreMailer.Net/Benchmarks/Program.cs b/PreMailer.Net/Benchmarks/Program.cs index f04d91e8..025fffd2 100644 --- a/PreMailer.Net/Benchmarks/Program.cs +++ b/PreMailer.Net/Benchmarks/Program.cs @@ -1,17 +1,30 @@ using AngleSharp; using AngleSharp.Html.Parser; using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Running; +using BenchmarkDotNet.Toolchains.InProcess.NoEmit; public static class Program { public static void Main() { - BenchmarkRunner.Run(); + // Some local environments may run into issues with Windows Defender or + // SentinelOne (and others) when running a benchmark. This ensures we + // keep our toolchain within our process and stops the above apps from blocking + // our benchmark process, but can slow the execution time. + var avSafeConfig = DefaultConfig.Instance + .AddJob( + Job.ShortRun + .WithToolchain(InProcessNoEmitToolchain.Instance) + .WithIterationCount(100) + ); + + BenchmarkRunner.Run(avSafeConfig); } } -[SimpleJob(invocationCount: 100, iterationCount: 100)] [MemoryDiagnoser] public class Realistic { @@ -47,7 +60,7 @@ public void MoveCssInline_AllFlags() PreMailer Benchmark - + diff --git a/PreMailer.Net/PreMailer.Net/Downloaders/WebDownloader.cs b/PreMailer.Net/PreMailer.Net/Downloaders/WebDownloader.cs index 281e7f33..d04de4d7 100644 --- a/PreMailer.Net/PreMailer.Net/Downloaders/WebDownloader.cs +++ b/PreMailer.Net/PreMailer.Net/Downloaders/WebDownloader.cs @@ -1,3 +1,4 @@ +using PreMailer.Net.Extensions; using System; using System.IO; using System.Net; @@ -8,7 +9,7 @@ namespace PreMailer.Net.Downloaders public class WebDownloader : IWebDownloader { private static IWebDownloader _sharedDownloader; - + private const string CssMimeType = "text/css"; public static IWebDownloader SharedDownloader { get @@ -29,8 +30,16 @@ public static IWebDownloader SharedDownloader public string DownloadString(Uri uri) { var request = WebRequest.Create(uri); + request.Headers.Add(HttpRequestHeader.Accept, CssMimeType); + using (var response = request.GetResponse()) { + // We only support this operation for CSS file/content types coming back + // from the response. If we get something different, throw with the unsupported + // content type in the message + if(response.ParseContentType() != CssMimeType) + throw new NotSupportedException($"The Uri type is giving a response in unsupported content type '{response.ContentType}'."); + switch (response) { case HttpWebResponse httpWebResponse: diff --git a/PreMailer.Net/PreMailer.Net/Extensions/WebResponseExtensions.cs b/PreMailer.Net/PreMailer.Net/Extensions/WebResponseExtensions.cs new file mode 100644 index 00000000..5508a35d --- /dev/null +++ b/PreMailer.Net/PreMailer.Net/Extensions/WebResponseExtensions.cs @@ -0,0 +1,24 @@ +using System; +using System.Net; + +namespace PreMailer.Net.Extensions +{ + public static class WebResponseExtensions + { + public static string ParseContentType(this WebResponse response) + { + if(response == null) + throw new NullReferenceException("Malformed response detected when parsing WebResponse Content-Type"); + + if(string.IsNullOrEmpty(response.ContentType)) + throw new NullReferenceException("Malformed Content-Type response detected when parsing WebResponse"); + + var results = response.ContentType.Split(';'); + + if(results.Length == 0) + throw new FormatException("Malformed Content-Type response detected when parsing WebResponse"); + + return results[0]; + } + } +}