using System.IO.Compression; using System.Web; using System.Web.Mvc; namespace Website.Filters { public class CompressableAttribute : ActionFilterAttribute { private bool _enabled = Parse.AppSetting("EnableContentCompression"); public bool Enabled { get { return _enabled; } set { _enabled = value; } } public override void OnActionExecuting(ActionExecutingContext filterContext) { // Check first to see if we should even think about compressing // this request at all. If not, just return now. if(!Enabled) return; var response = filterContext.HttpContext.Response; switch (GetCompressionType(filterContext.HttpContext.Request)) { case(CompressionType.Deflate): response.AppendHeader("Content-encoding", "deflate"); response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); break; case(CompressionType.GZip): response.AppendHeader("Content-encoding", "gzip"); response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); break; } } private static CompressionType GetCompressionType(HttpRequestBase request) { // Get the type of compression (if any) the client has given us. var acceptedEncodings = (request.ServerVariables["HTTP_ACCEPT_ENCODING"] ?? string.Empty).ToLowerInvariant(); // If we didn't get anything, just bail out now. if (string.IsNullOrEmpty(acceptedEncodings)) return CompressionType.None; // Otherwise, try to figure out if it's a compression type we know about... var compressionType = CompressionType.None; // Look at the header value(s) and see if they match anything we're looking for if (acceptedEncodings.Contains("gzip") || acceptedEncodings.Contains("*")) compressionType = CompressionType.GZip; else if (acceptedEncodings.Contains("deflate")) compressionType = CompressionType.Deflate; return compressionType; } enum CompressionType { Deflate, GZip, None } } }