/// <summary> /// Process & Write a StreamReader to an output stream /// </summary> /// <param name="reader"></param> /// <param name="context"></param> /// <param name="encodingMgr"></param> private static void ProcessAndWriteToStream(StreamReader reader, HttpContext context, EncodingManager encodingMgr) { string content = SR.GetString(SR.CREDIT_STRING); if (Settings.Instance.MinifyContent) { if (context.Response.ContentType.Contains("javascript")) { JavaScriptMinifier _Minifier = new JavaScriptMinifier(); content += _Minifier.Minify(reader); } else if (context.Response.ContentType.Contains("css")) { CssMinifier _Minifier = new CssMinifier(); content += _Minifier.Minify(reader); } else { content += reader.ReadToEnd(); } } else { content += reader.ReadToEnd(); } if (encodingMgr.IsEncodingEnabled && Settings.Instance.CompressWebResource) { encodingMgr.SetResponseEncodingType(); byte[] compressed = encodingMgr.CompressString(content); context.Response.OutputStream.Write(compressed, 0, compressed.Length); } else { context.Response.Write(content); } }
/// <summary> /// Excute the request and response the needes content /// <para>Save the response in the file system for next requests</para> /// </summary> /// <param name="context"></param> /// <param name="filesInfo"></param> /// <param name="minify"></param> /// <param name="versionHash"></param> /// <param name="encodingMgr"></param> public void Excute(HttpContext context, string[] filesInfo, Minifier minify, int versionHash, EncodingManager encodingMgr) { string phisicalRoot = context.Server.MapPath("~/") + cReferencesCache; string fullPath; if (encodingMgr.IsEncodingEnabled) { fullPath = phisicalRoot + "comp_" + encodingMgr.PreferredEncoding + "_" + versionHash + (minify.Target is JavaScriptCompressionHandler ? ".js" : ".css"); encodingMgr.SetResponseEncodingType(); } else { fullPath = phisicalRoot + versionHash + (minify.Target is JavaScriptCompressionHandler ? ".js" : ".css"); } SetResponseCacheSettings(context, null); if (!File.Exists(fullPath)) { lock (_syncObject) { if (!File.Exists(fullPath)) { if (!Directory.Exists(phisicalRoot)) { Directory.CreateDirectory(phisicalRoot); } if (encodingMgr.IsEncodingEnabled) { StringBuilder contentSb = new StringBuilder(SR.GetString(SR.CREDIT_STRING)); foreach (string fileName in filesInfo) { if (fileName.StartsWith("NOT_FOUND", StringComparison.Ordinal)) { contentSb.AppendFormat(SR.File_FileNotFound + Environment.NewLine, Path.GetFileName(fileName.Split('|')[1])); } else { using (StreamReader reader = new StreamReader(fileName, context.Response.ContentEncoding)) { if (Settings.Instance.IsValidPathForMinify(fileName)) { contentSb.AppendLine(minify(reader)); } else { contentSb.AppendLine(reader.ReadToEnd()); } } } } using (FileStream fs = new FileStream(fullPath, FileMode.Create)) { byte[] compressedContent = encodingMgr.CompressString(contentSb.ToString()); fs.Write(compressedContent, 0, compressedContent.Length); } // Release the StringBuilder contentSb.Length = 0; } else { using (FileStream fs = new FileStream(fullPath, FileMode.Create)) using (StreamWriter sw = new StreamWriter(fs,context.Response.ContentEncoding)) { string content = SR.GetString(SR.CREDIT_STRING); sw.WriteLine(content); foreach (string fileName in filesInfo) { if (fileName.Length == 0) { content = string.Format(CultureInfo.CurrentCulture, SR.File_FileNotFound, Path.GetFileName(fileName)); } else { using (StreamReader reader = new StreamReader(fileName, context.Response.ContentEncoding)) { if (Settings.Instance.IsValidPathForMinify(fileName)) { content = minify(reader); } else { content = reader.ReadToEnd(); } } } sw.WriteLine(content); } } } } } } context.Response.TransmitFile(fullPath); }