示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }