} // func CreateScript public static void WriteContent(this IDEContext context, Func <Stream> createSource, string cacheId, string contentType) { if (cacheId == null) { throw new ArgumentNullException("cacheId"); } if (contentType == null) { throw new ArgumentNullException("contentType"); } var http = context.Server as IDEHttpServer; var o = http?.GetWebCache(cacheId); // create the item if (o == null) { using (var src = createSource()) { var isLua = contentType == MimeTypes.Text.Lua; var isHtml = contentType == MimeTypes.Text.Html; var cacheItem = isLua || isHtml || (src.CanSeek && src.Length < CacheSize); if (cacheItem) { var isText = contentType.StartsWith("text/"); if (isLua) { o = CreateScript(context, cacheId, () => Procs.OpenStreamReader(src, Encoding.Default)); } else if (isHtml) { bool isPlainText; var content = "otext('text/html');" + ParseHtml(Procs.OpenStreamReader(src, Encoding.Default), src.CanSeek ? src.Length : 1024, out isPlainText); o = isPlainText ? content : CreateScript(context, cacheId, () => new StringReader(content)); } else if (isText) { using (var tr = Procs.OpenStreamReader(src, Encoding.Default)) o = tr.ReadToEnd(); } else { o = src.ReadInArray(); } // write the cache item http?.UpdateWebCache(cacheId, o); } else // write data without cache { WriteStream(context, src, contentType); return; } } } // write the item to the output if (o == null) { throw new ArgumentNullException("output", "No valid output."); } else if (o is ILuaScript) { var c = (ILuaScript)o; LuaResult r; using (var g = new LuaHttpTable(context, contentType)) r = c.Run(g, true); if (!context.IsOutputStarted && r.Count > 0) { WriteObject(context, r[0], r.GetValueOrDefault(1, MimeTypes.Text.Html)); } } else if (o is byte[]) { WriteBytes(context, (byte[])o, contentType); } else if (o is string) { WriteText(context, (string)o, contentType, context.Server.Encoding); } else { throw new ArgumentException($"Invalid cache item. Type '{o.GetType()}' is not supported."); } } // func GetContent