Skip to content

Commit

Permalink
Ensure external sources for styles only process CSS responses when in…
Browse files Browse the repository at this point in the history
…lining stylesheets
  • Loading branch information
agrande-ea committed Nov 7, 2024
1 parent 3c70622 commit e07d661
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 4 deletions.
19 changes: 16 additions & 3 deletions PreMailer.Net/Benchmarks/Program.cs
Original file line number Diff line number Diff line change
@@ -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<Realistic>();
// 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<Realistic>(avSafeConfig);
}
}

[SimpleJob(invocationCount: 100, iterationCount: 100)]
[MemoryDiagnoser]
public class Realistic
{
Expand Down Expand Up @@ -47,7 +60,7 @@ public void MoveCssInline_AllFlags()
<meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" />
<title>PreMailer Benchmark</title>
</head>
<body bgcolor=""#123"">
Expand Down
11 changes: 10 additions & 1 deletion PreMailer.Net/PreMailer.Net/Downloaders/WebDownloader.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using PreMailer.Net.Extensions;
using System;
using System.IO;
using System.Net;
Expand All @@ -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
Expand All @@ -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:
Expand Down
24 changes: 24 additions & 0 deletions PreMailer.Net/PreMailer.Net/Extensions/WebResponseExtensions.cs
Original file line number Diff line number Diff line change
@@ -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];
}
}
}

0 comments on commit e07d661

Please sign in to comment.