novelty.go (1431B)
1 package main 2 3 import ( 4 "google.golang.org/appengine" 5 "google.golang.org/appengine/datastore" 6 "html/template" 7 "net/http" 8 "os" 9 ) 10 11 type Answer struct { 12 Value string 13 } 14 15 type Password struct { 16 Value string 17 } 18 19 func main() { 20 http.HandleFunc("/", getAnswer) 21 http.HandleFunc("/yes", setAnswer("yes")) 22 http.HandleFunc("/no", setAnswer("no")) 23 appengine.Main() 24 } 25 26 func getAnswer(w http.ResponseWriter, r *http.Request) { 27 c := appengine.NewContext(r) 28 k := datastore.NewKey(c, "Answer", "answer", 0, nil) 29 a := new(Answer) 30 if err := datastore.Get(c, k, a); err != nil { 31 http.Error(w, err.Error(), http.StatusInternalServerError) 32 return 33 } 34 t := template.Must(template.ParseFiles("index.template")) 35 if err := t.Execute(w, a); err != nil { 36 http.Error(w, err.Error(), http.StatusInternalServerError) 37 } 38 } 39 40 func setAnswer(answer string) func(w http.ResponseWriter, r *http.Request) { 41 return func(w http.ResponseWriter, r *http.Request) { 42 if _, p, ok := r.BasicAuth(); !ok || p != os.Getenv("PASSWORD") { 43 w.Header().Set("WWW-Authenticate", "Basic") 44 http.Error(w, "Unauthorized", http.StatusUnauthorized) 45 return 46 } 47 c := appengine.NewContext(r) 48 k := datastore.NewKey(c, "Answer", "answer", 0, nil) 49 a := Answer{ 50 Value: answer, 51 } 52 if _, err := datastore.Put(c, k, &a); err != nil { 53 http.Error(w, err.Error(), http.StatusInternalServerError) 54 return 55 } 56 http.Redirect(w, r, "/", http.StatusFound) 57 } 58 }