Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,18 @@ public class PlaceholderReplacingResponseFilter_Tests : IDisposable
{
readonly MemoryStream outputStream;
readonly Mock<HttpResponseBase> response;
readonly Mock<HttpRequestBase> request;
readonly Mock<IPlaceholderTracker> placeholderTracker;
readonly PlaceholderReplacingResponseFilter filter;

public PlaceholderReplacingResponseFilter_Tests()
{
outputStream = new MemoryStream();
response = new Mock<HttpResponseBase>();
request = new Mock<HttpRequestBase>();
request.SetupGet(r => r.Headers).Returns(new NameValueCollection());


placeholderTracker = new Mock<IPlaceholderTracker>();

placeholderTracker.Setup(h => h.ReplacePlaceholders(It.IsAny<string>()))
Expand All @@ -28,7 +33,7 @@ public PlaceholderReplacingResponseFilter_Tests()
response.SetupGet(r => r.Output.Encoding).Returns(Encoding.ASCII);
response.SetupGet(r => r.Filter).Returns(outputStream);
response.SetupGet(r => r.Headers).Returns(new NameValueCollection());
filter = new PlaceholderReplacingResponseFilter(response.Object, placeholderTracker.Object);
filter = new PlaceholderReplacingResponseFilter(new CassetteSettings(), response.Object, request.Object, placeholderTracker.Object);
}

[Fact]
Expand Down
23 changes: 21 additions & 2 deletions src/Cassette.Aspnet/PlaceholderReplacingResponseFilter.cs
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Web;

namespace Cassette.Aspnet
{
class PlaceholderReplacingResponseFilter : MemoryStream
{
public PlaceholderReplacingResponseFilter(HttpResponseBase response, IPlaceholderTracker placeholderTracker)
public PlaceholderReplacingResponseFilter(CassetteSettings settings, HttpResponseBase response, HttpRequestBase request, IPlaceholderTracker placeholderTracker)
{
this.settings = settings;
this.response = response;
this.request = request;
this.placeholderTracker = placeholderTracker;
outputStream = response.Filter;
htmlBuffer = new StringBuilder();
}

readonly CassetteSettings settings;
readonly Stream outputStream;
readonly HttpResponseBase response;
readonly HttpRequestBase request;
readonly IPlaceholderTracker placeholderTracker;
readonly StringBuilder htmlBuffer;
bool hasWrittenToOutputStream;



public override void Write(byte[] buffer, int offset, int count)
{
if (HttpRuntime.UsingIntegratedPipeline && response.Headers["Content-Encoding"] != null)
Expand Down Expand Up @@ -56,7 +63,19 @@ void WriteBufferedOutput()
var outputBytes = encoding.GetBytes(output);
if (outputBytes.Length > 0)
{
outputStream.Write(outputBytes, 0, outputBytes.Length);
var acceptEncodingRequest = request.Headers["Accept-Encoding"];
if (settings.IsCompressionEnabled && !String.IsNullOrEmpty(acceptEncodingRequest) && acceptEncodingRequest.Contains("gzip"))
{
response.AppendHeader("Content-Encoding", "gzip");
response.Cache.VaryByHeaders["Accept-Encoding"] = true;
var compressedStream = new GZipStream(outputStream, CompressionMode.Compress);
compressedStream.Write(outputBytes, 0, outputBytes.Length);
compressedStream.Close();
}
else
{
outputStream.Write(outputBytes, 0, outputBytes.Length);
}
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/Cassette.Aspnet/PlaceholderRewriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ public void RewriteOutput()
void InstallPlaceholderReplacingResponseFilter(HttpContextBase httpContext)
{
var response = httpContext.Response;
var request = httpContext.Request;
var tracker = (IPlaceholderTracker)httpContext.Items[PlaceholderTrackerKey];
var filter = new PlaceholderReplacingResponseFilter(response, tracker);
var filter = new PlaceholderReplacingResponseFilter(settings, response, request, tracker);
response.Filter = filter;
}

Expand Down
2 changes: 1 addition & 1 deletion src/Cassette.Aspnet/WebHostSettingsConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void Configure(CassetteSettings settings)
settings.SourceDirectory = new FileSystemDirectory(AppDomainAppPath);
settings.CacheDirectory = GetCacheDirectory(configurationSection);
settings.IsFileSystemWatchingEnabled = TrustLevel.IsFullTrust() && !IsStaticCacheManifest(settings);

settings.IsCompressionEnabled = configurationSection.CompressionEnabled;
IsStaticCacheManifest(settings);

// Include the virtual directory so that if the application is moved to
Expand Down
7 changes: 7 additions & 0 deletions src/Cassette/CassetteConfigurationSection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,12 @@ public string CacheDirectory
get { return (string)this["cacheDirectory"]; }
set { this["cacheDirectory"] = value; }
}

[ConfigurationProperty("compressionEnabled", DefaultValue = false)]
public bool CompressionEnabled
{
get { return (bool)this["compressionEnabled"]; }
set { this["compressionEnabled"] = value; }
}
}
}
2 changes: 2 additions & 0 deletions src/Cassette/CassetteSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,7 @@ void ApplyConfigurations(IEnumerable<IConfiguration<CassetteSettings>> configura
public string Version { get; set; }

public bool IsFileSystemWatchingEnabled { get; set; }

public bool IsCompressionEnabled { get; set; }
}
}