Exemplo n.º 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);
        }
Exemplo n.º 2
0
        /// <summary>Returns the result as HTML answer.</summary>
        /// <returns></returns>
        public WebAnswer ToAnswer(WebMessage message)
        {
            var sb = new StringBuilder();

            sb.AppendLine("<!DOCTYPE html>");
            sb.AppendLine($"<html><head><title>{WebUtility.HtmlEncode(message.Source)}</title>");
            sb.Append(Header);
            sb.AppendLine("</head><body>");
            sb.AppendLine("<div class=\"container-fluid\">");
            if (Breadcrump != null)
            {
                sb.AppendLine("<ol class=\"breadcrumb\">");
                WebLink[] links = Breadcrump.ToArray();
                int       last  = links.Length - 1;
                for (int i = 0; i < links.Length; i++)
                {
                    if (i != last)
                    {
                        sb.Append("<li class=\"breadcrumb-item\">");
                    }
                    else
                    {
                        sb.Append("<li class=\"breadcrumb-item active\">");
                    }

                    sb.Append(links[i]);
                    sb.Append("</li>");
                }
                sb.AppendLine("</ol>");
            }
            if (message.Error == WebError.None)
            {
                sb.AppendLine("<div class=\"alert alert-success\" role=\"alert\">");
            }
            else
            {
                sb.AppendLine("<div class=\"alert alert-danger\" role=\"alert\">");
            }
            sb.Append($"<strong>{(int)message.Code} {message.Code} {WebUtility.HtmlEncode(message.Source)}");
            if (message.Error != WebError.None)
            {
                sb.Append($" ({message.Error})");
            }

            sb.Append("</strong><p>");
            sb.AppendLine(WebUtility.HtmlEncode(message.Content));
            sb.AppendLine("</p></div>");
            sb.Append(Content);
            sb.Append(Footer);
            sb.AppendLine("</div>");
            sb.AppendLine("</body></html>");
            return(WebAnswer.Html(request, message, sb.ToString()));
        }
Exemplo n.º 3
0
 private WebAnswer GetPlainAnswer()
 {
     using (var ms = new MemoryStream())
     {
         foreach (KeyValuePair <string, SerializerTable> t in tables)
         {
             SerializerTable table = t.Value;
             ms.WriteUtf8($"[Table: {table.Name}]\n");
             var writer = new CSVWriter(ms);
             writer.SetLayout(table.Layout);
             writer.WriteRows(table.Rows);
             writer.Close();
             ms.WriteUtf8($"#end table: {table.Name}\n\n");
         }
         return(WebAnswer.Plain(Request, lastMessage, ms.ToArray()));
     }
 }
Exemplo n.º 4
0
        WebAnswer GetXmlAnswer()
        {
            XmlSerializer.Flags flags = 0;
            if (TransmitLayout)
            {
                flags |= XmlSerializer.Flags.WithLayout;
            }

            var xml = new XmlSerializer(Server.JsonVersion, flags);

            foreach (KeyValuePair <string, SerializerTable> t in tables)
            {
                SerializerTable table = t.Value;
                xml.Serialize(table.Name, table.Layout, table.Rows);
            }

            return(WebAnswer.Xml(Request, lastMessage, xml.ToString()));
        }
Exemplo n.º 5
0
        WebAnswer GetJsonAnswer()
        {
            JsonSerializer.Flags flags = 0;
            if (SkipMainObject)
            {
                flags |= JsonSerializer.Flags.SkipMainObject;
            }

            if (TransmitLayout)
            {
                flags |= JsonSerializer.Flags.WithLayout;
            }

            var json = new JsonSerializer(Server.JsonVersion, flags);

            foreach (KeyValuePair <string, SerializerTable> t in tables)
            {
                SerializerTable table = t.Value;
                json.Serialize(table.Name, table.Layout, table.Rows);
            }
            return(WebAnswer.Json(Request, lastMessage, json.ToString()));
        }
Exemplo n.º 6
0
        /// <summary>Writes the answer.</summary>
        /// <param name="answer">The answer.</param>
        public void SendAnswer(WebAnswer answer)
        {
            Writer.WriteLine($"HTTP/1.1 {(int)answer.StatusCode} {answer.StatusCode}");
            if (answer == null)
            {
                answer = WebAnswer.Empty;
            }

            answer.Headers["Date"]       = DateTime.Now.ToString("R");
            answer.Headers["Server"]     = "CaveSystems WebServer";
            answer.Headers["Connection"] = answer.CloseAfterAnswer ? "close" : "persistent";
            if (!WebServer.DisableCompression && (WebServer.ForceCompression || answer.AllowCompression) && (answer.ContentData.Length > 128))
            {
                byte[] packed = answer.ContentData.Gzip();
                if (packed.Length < answer.ContentData.Length)
                {
                    answer.ContentData = packed;
                    answer.Headers["Content-Encoding"] = "gzip";
                }
            }
            foreach (System.Collections.Generic.KeyValuePair <string, string> header in answer.Headers)
            {
                Writer.WriteLine(header.Key + ": " + header.Value);
            }
            Writer.WriteLine();
            if (answer.ContentData != null)
            {
                Writer.Write(answer.ContentData);
            }
            Writer.Flush();
            Trace.TraceInformation("{0}. Elapsed <cyan>{1}<default>.", answer, StopWatch.Elapsed.FormatTime());
            if (answer.CloseAfterAnswer)
            {
                Close();
            }
        }
Exemplo n.º 7
0
        void HandleRequest(WebServerClient client, WebData data)
        {
            // add acl headers
            if (Certificate != null)
            {
                data.Result.Headers["Strict-Transport-Security"] = "max-age=604800; includeSubDomains";
            }

            data.Result.Headers["Access-Control-Allow-Headers"] = "Session";
            if (data.Method?.PageAttribute?.AuthType == WebServerAuthType.Basic)
            {
                data.Result.Headers["Access-Control-Allow-Credentials"] = "true";
                data.Result.Headers["Access-Control-Allow-Headers"]    += ", Authorization";
            }
            if (!data.Result.Headers.ContainsKey("Access-Control-Allow-Origin"))
            {
                data.Result.Headers["Access-Control-Allow-Origin"] = string.IsNullOrEmpty(data.Request.Origin) ? "*" : data.Request.Origin;
            }

            if (!data.Result.Headers.ContainsKey("Access-Control-Allow-Methods"))
            {
                data.Result.Headers["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS";
            }

            if (data.Method?.PageAttribute?.AllowHeaders != null)
            {
                data.Result.Headers["Access-Control-Allow-Headers"] += ", " + data.Method.PageAttribute.AllowHeaders;
            }

            if (data.Request.Command == WebCommand.OPTIONS)
            {
                data.Result.AddMessage(data.Method, "Options transfered successfully.");
                client.SendAnswer(data);
                return;
            }

            data.Request.LoadPost(client);

            if (data.Method == null)
            {
                Trace.TraceInformation("Static Request: {0}", data.Request);

                if (StaticRequest != null)
                {
                    var e = new WebPageEventArgs(data);
                    StaticRequest(this, e);
                    if (e.Handled)
                    {
                        client.SendAnswer(data);
                        return;
                    }
                }

                if (EnableTemplates && RunTemplate(data))
                {
                    Trace.TraceInformation("Template: {0} {1}", data.Request, data.Result);
                    client.SendAnswer(data);
                    return;
                }

                // no method - send static file ?
                WebAnswer staticFile = GetStaticFile(data.Request);
                if (staticFile != null)
                {
                    // file present, send answer
                    Trace.TraceInformation("Static file: {0} {1}", data.Request, staticFile);
                    SetStaticCacheTime(staticFile, StaticPathCacheTime);
                    client.SendAnswer(staticFile);
                    return;
                }

                // static path access -> set cache time
                SetStaticCacheTime(data, StaticPathCacheTime);

                // file not present, check special functions
                if (EnableExplain && (data.Request.DecodedUrl.ToLower() == "/explain" || data.Request.DecodedUrl.ToLower() == "/functionlist"))
                {
                    // special page (function list / explain)
                    explain.Explain(data);
                }
                else if (EnableFileListing)
                {
                    // list files
                    GetStaticFileListing(data);
                }
                else
                {
                    // no static -> error
                    data.Result.AddMessage(data.Request.PlainUrl, WebError.NotFound, $"The requested URL {data.Request.DecodedUrl} was not found on this server.");
                }
                client.SendAnswer(data);
                return;
            }

            // invoke method
            CallMethod(data);

            // send answer
            client.SendAnswer(data);
        }
Exemplo n.º 8
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);
        }