using System; using System.Globalization; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; public class PostHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { if (!context.User.Identity.IsAuthenticated || Blog.MatchesUniqueId(context)) throw new HttpException(403, "No access"); string mode = context.Request.QueryString["mode"]; string id = context.Request.Form["id"]; if (mode == "delete") { DeletePost(id); } else if (mode == "save") { EditPost(id, context.Request.Form["title"], context.Request.Form["content"], bool.Parse(context.Request.Form["isPublished"]), context.Request.Form["categories"].Split(',')); } } private void DeletePost(string id) { Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == id); if (post == null) throw new HttpException(404, "The post does not exist"); Storage.Delete(post); } private void EditPost(string id, string title, string content, bool isPublished, string[] categories) { Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == id); if (post != null) { post.Title = title; post.Content = content; post.Categories = categories; } else { post = new Post() { Title = title, Content = content, Slug = CreateSlug(title), Categories = categories }; HttpContext.Current.Response.Write(post.Url); } SaveFilesToDisk(post); post.IsPublished = isPublished; Storage.Save(post); } private void SaveFilesToDisk(Post post) { foreach (Match match in Regex.Matches(post.Content, "(src|href)=\"(data:([^\"]+))\"")) { string extension = Regex.Match(match.Value, "data:([^/]+)/([a-z]+);base64").Groups[2].Value; byte[] bytes = ConvertToBytes(match.Groups[2].Value); string path = Blog.SaveFileToDisk(bytes, extension); string value = string.Format("src=\"{0}\" alt=\"\" /", path); if (match.Groups[1].Value == "href") value = string.Format("href=\"{0}\"", path); post.Content = post.Content.Replace(match.Value, value); } } private byte[] ConvertToBytes(string base64) { int index = base64.IndexOf("base64,", StringComparison.Ordinal) + 7; return Convert.FromBase64String(base64.Substring(index)); } public static string CreateSlug(string title) { title = title.ToLowerInvariant().Replace(" ", "-"); title = RemoveDiacritics(title); title = Regex.Replace(title, @"([^0-9a-z-])", string.Empty); if (Storage.GetAllPosts().Any(p => string.Equals(p.Slug, title))) throw new HttpException(409, "Already in use"); return title.ToLowerInvariant(); } static string RemoveDiacritics(string text) { var normalizedString = text.Normalize(NormalizationForm.FormD); var stringBuilder = new StringBuilder(); foreach (var c in normalizedString) { var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); if (unicodeCategory != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } public bool IsReusable { get { return false; } } }