package main import ( "fmt" "html/template" "log" "net/http" "os" ) type Page struct { Title string Body []byte } func loadPage(title string) (*Page, error) { body, err := os.ReadFile(title + ".txt") if err != nil { return nil, err } return &Page{Title: title, Body: body}, nil } func (p *Page) savePage() error { filename := p.Title + ".txt" return os.WriteFile(filename, p.Body, 0600) } func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] page, err := loadPage(title) if err != nil { fmt.Fprintf(w, "

ERROR

%s not found!

", title) } else { fmt.Fprintf(w, "

%s

%s

", page.Title, string(page.Body)) } } func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/save/"):] p := &Page{Title: title, Body: []byte(r.FormValue("body"))} p.savePage() http.Redirect(w, r, "/view/"+title, http.StatusFound) } func editHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/edit/"):] page, err := loadPage(title) if err != nil { page = &Page{Title: title} } t, _ := template.ParseFiles("edit.html") t.Execute(w, page) } func main() { http.HandleFunc("/view/", viewHandler) http.HandleFunc("/save/", saveHandler) http.HandleFunc("/edit/", editHandler) log.Fatal(http.ListenAndServe(":8080", nil)) }