Ejemplo n.º 1
0
        private void Abort(int errorCode, string errorMessage)
        {
            var session = GetSession();

            session["ErrorMessage"] = $"{errorCode}: {errorMessage}";

            var output = Encoding.Default.GetBytes(TemplatingEngine.Parse(session, Pages.Error));

            Response.StatusCode        = errorCode;
            Response.StatusDescription = errorMessage;
            Response.ContentEncoding   = Encoding.Default;
            Response.ContentLength64   = output.LongLength;
            Response.OutputStream.WriteAsync(output, 0, output.Length);
            Response.OutputStream.Flush();
            Response.Close();
        }
Ejemplo n.º 2
0
        private void HandleGet(string path)
        {
            var session = GetSession();

            // GET request for a method
            if (Route != null)
            {
                if (!HasAccess())
                {
                    Abort(401, "Unauthorized access");

                    return;
                }

                var method = Route.GetAssociatedMethod();

                var parameters = new Dictionary <string, dynamic>();

                foreach (var p in method.GetParameters())
                {
                    if (p.IsOptional && !Request.QueryString.AllKeys.Contains(p.Name))
                    {
                        parameters[p.Name] = p.DefaultValue;

                        continue;
                    }

                    if (!p.IsOptional && Nullable.GetUnderlyingType(p.ParameterType) == null && !Request.QueryString.AllKeys.Contains(p.Name))
                    {
                        Abort(400, $"Parameter `{p.Name}` is missing value for a method call.");

                        return;
                    }

                    var pType = Nullable.GetUnderlyingType(p.ParameterType) ?? p.ParameterType;

                    parameters[p.Name] = Request.QueryString[p.Name] != null?Convert.ChangeType(Request.QueryString[p.Name], pType) : null;
                }

                var returnValue = method.Invoke(null, parameters.Values.Cast <object>().ToArray());

                if (returnValue is Response)
                {
                    var resp = returnValue as Response;

                    Response.StatusCode = 200;
                    Response.Redirect(RootUrl + resp.Redirect);
                    Response.Close();

                    return;
                }

                if (returnValue != null)
                {
                    var output = Encoding.Default.GetBytes(returnValue.ToString());

                    Response.ContentEncoding = Encoding.Default;
                    Response.ContentLength64 = output.LongLength;
                    Response.OutputStream.WriteAsync(output, 0, output.Length);
                    Response.OutputStream.Flush();
                }

                Response.StatusCode = 200;
                Response.Close();

                return;
            }

            // GET request for a file
            if (!Path.HasExtension(path))
            {
                path += ".html";
            }

            if (!File.Exists(path))
            {
                Abort(404, $"GET request leads to a file that doesn't exist. Verify your path.");

                return;
            }

            if (!HasFileAccess(path))
            {
                Abort(401, $"Unauthorized file access.");

                return;
            }

            var text = File.ReadAllText(path);

            var data = Encoding.Default.GetBytes(path.EndsWith(".html") ? TemplatingEngine.Parse(session, text) : text);

            Response.StatusCode      = 200;
            Response.ContentEncoding = Encoding.Default;
            Response.ContentLength64 = data.LongLength;
            Response.OutputStream.WriteAsync(data, 0, data.Length);
            Response.OutputStream.Flush();
            Response.Close();

            return;
        }