Created
November 28, 2022 17:52
-
-
Save gowthamgts/0a106babba5e27ed851dfecabc6cb982 to your computer and use it in GitHub Desktop.
a starter golang server - https://go.dev/doc/articles/wiki/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"html/template" | |
"log" | |
"net/http" | |
"os" | |
"regexp" | |
) | |
type Page struct { | |
Title string | |
Body []byte | |
} | |
func (p *Page) save() error { | |
filename := p.Title + ".txt" | |
return os.WriteFile(filename, p.Body, 0600) | |
} | |
func load(title string) (*Page, error) { | |
filename := title + ".txt" | |
body, err := os.ReadFile(filename) | |
if err != nil { | |
return nil, err | |
} | |
return &Page{Title: title, Body: body}, nil | |
} | |
var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$") | |
var templates = template.Must(template.ParseFiles("edit.html", "view.html")) | |
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { | |
err := templates.ExecuteTemplate(w, tmpl+".html", p) | |
if err != nil { | |
http.Error(w, err.Error(), http.StatusInternalServerError) | |
} | |
} | |
// handlers start here | |
func viewHandler(w http.ResponseWriter, r *http.Request, title string) { | |
p, err := load(title) | |
if err != nil { | |
http.Redirect(w, r, "/edit/"+title, http.StatusFound) | |
return | |
} | |
renderTemplate(w, "view", p) | |
} | |
func editHandler(w http.ResponseWriter, r *http.Request, title string) { | |
p, err := load(title) | |
if err != nil { | |
p = &Page{Title: title} | |
} | |
renderTemplate(w, "edit", p) | |
} | |
func saveHandler(w http.ResponseWriter, r *http.Request, title string) { | |
body := r.FormValue("body") | |
p := &Page{Title: title, Body: []byte(body)} | |
err := p.save() | |
if err != nil { | |
http.Error(w, err.Error(), http.StatusInternalServerError) | |
return | |
} | |
http.Redirect(w, r, "/view/"+title, http.StatusFound) | |
} | |
func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { | |
return func(w http.ResponseWriter, r *http.Request) { | |
// get title | |
m := validPath.FindStringSubmatch(r.URL.Path) | |
if m == nil { | |
http.NotFound(w, r) | |
return | |
} | |
fn(w, r, m[2]) | |
} | |
} | |
func main() { | |
http.HandleFunc("/view/", makeHandler(viewHandler)) | |
http.HandleFunc("/edit/", makeHandler(editHandler)) | |
http.HandleFunc("/save/", makeHandler(saveHandler)) | |
log.Fatal(http.ListenAndServe(":8080", nil)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment