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(); }
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; }