WebAnswer GetStaticFile(WebRequest request) { string url = Uri.UnescapeDataString(request.DecodedUrl).TrimStart('/'); if (url == string.Empty) { url = "index.html"; } else { url += request.Extension; } string file = FileSystem.Combine(StaticFilesPath, url); if (!FileSystem.IsRelative(file, StaticFilesPath)) { return(null); } if (!File.Exists(file)) { return(null); } Trace.TraceInformation("Get static file {0}", url); var answer = WebAnswer.Raw( request, WebMessage.Create(request.PlainUrl, $"<cyan>{url} <default>retrieved."), File.ReadAllBytes(file), MimeTypes.FromExtension(Path.GetExtension(file))); return(answer); }
/// <summary>Builds the template.</summary> /// <param name="data">The data.</param> /// <returns>Returns true on success, false otherwise.</returns> public bool Render(WebData data) { if (data.Server != server) { throw new ArgumentOutOfRangeException(nameof(data.Server)); } { // need reload ? DateTime lastChanged = FileSystem.GetLastWriteTimeUtc(FileName); if (lastChanged != LastChanged) { Reload(); } } // do auth and load user session (if any) data.Result.SkipMainObject = true; data.Result.TransmitLayout = false; // call functions IDictionary <string, string> templateParameters = data.Request.Parameters; var tables = new Set <string>(); var parameterDescription = new List <WebTemplateParameter>(); for (int i = 0; i < functions.Length; i++) { Func function = functions[i]; parameterDescription.AddRange(function.ParameterDescriptions); if (function.NeededParameters.Count > 0) { // foreach neededparameters, any parameter is not at tmeplate parameters -> continue if (function.NeededParameters.Where(n => !templateParameters.ContainsKey(n)).Any()) { continue; } } var functionParameters = new Dictionary <string, string>(); foreach (System.Reflection.ParameterInfo methodParameter in function.Method.Parameters) { // lookup function parameter name from function section at template if (!function.Parameters.TryGetValue(methodParameter.Name, out string templateParameterName)) { continue; } // parameter name at template could be loaded if (!templateParameters.TryGetValue(templateParameterName, out string parameterValue)) { if (!methodParameter.IsOptional) { // no value given and is not optional throw new WebServerException(WebError.InvalidParameters, $"Template error: Missing {methodParameter.Name} is not for function {function} is not set. Define {templateParameterName} at template call!"); } continue; } functionParameters[methodParameter.Name] = parameterValue; } data.Request.Parameters = new ReadOnlyDictionary <string, string>(functionParameters); // invoke method data.Method = function.Method; data.Server.CallMethod(data); } Stopwatch renderWatch = server.PerformanceChecks ? Stopwatch.StartNew() : null; // replace content byte[] result = staticData ?? BuildStaticData(content); if (renderWatch != null) { Trace.TraceInformation("Template static data generation took {0}", renderWatch.Elapsed.FormatTime()); } // render data { data.Result.Type = WebResultType.Json; data.Result.AddStructs(parameterDescription); WebAnswer answer = data.Result.ToAnswer(); result = result.ReplaceFirst(Tag, ScriptStart, answer.ContentData, ScriptEnd); } // set result data.Result = null; WebMessage message; if (data.Method != null) { message = WebMessage.Create(data.Method, $"Template call <cyan>{data.Request}<default> succeeded."); } else { message = WebMessage.Create($"Static {data.Request.PlainUrl}", $"Template call <cyan>{data.Request}<default> succeeded."); } data.Answer = WebAnswer.Raw(data.Request, message, result, "text/html"); return(true); }