handle bad requests - twitch-go - twitch.tv web application in Go
 (HTM) git clone git://git.codemadness.org/twitch-go
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c8815efa5feed2bb13b44286806eb568b3f13b3e
 (DIR) parent e11fa18a7c6d467bbb58e57eea61bf300f008e26
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun, 17 May 2015 11:06:33 +0200
       
       handle bad requests
       
       Diffstat:
         M handlers.go                         |      14 ++++++++++++--
         M main.go                             |      13 ++++++++++---
       
       2 files changed, 22 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/handlers.go b/handlers.go
       @@ -17,7 +17,11 @@ func FeaturedHandler(w http.ResponseWriter, r *http.Request) error {
        
        func PlaylistHandler(w http.ResponseWriter, r *http.Request) error {
                channel := r.FormValue("c")
       -        format := r.FormValue("f")
       +        if channel == "" {
       +                BadRequest(w, "No channel name specified")
       +                return nil
       +        }
       +        format := r.FormValue("f") // if empty "redirect".
                token, err := twitch.GetToken(channel)
                if err != nil {
                        return err
       @@ -35,13 +39,19 @@ func PlaylistHandler(w http.ResponseWriter, r *http.Request) error {
                default: // redirect
                        w.Header().Set("Location", url)
                        w.WriteHeader(http.StatusFound)
       -                w.Write([]byte(url))
       +                if r.Method == "GET" {
       +                        w.Write([]byte(url))
       +                }
                }
                return nil
        }
        
        func GameHandler(w http.ResponseWriter, r *http.Request) error {
                gamename := r.FormValue("g")
       +        if gamename == "" {
       +                BadRequest(w, "No game name specified")
       +                return nil
       +        }
                game, err := twitch.GetGame(gamename)
                if err != nil {
                        return err
 (DIR) diff --git a/main.go b/main.go
       @@ -28,6 +28,8 @@ type Config struct {
                Pidfile          string
        }
        
       +type TwitchHandler func(http.ResponseWriter, *http.Request) error
       +
        type Templates struct {
                Pages  map[string]*template.Template
                Themes map[string]*template.Template
       @@ -114,17 +116,22 @@ func (t *Templates) LoadTemplates(path string) (map[string]*template.Template, e
                return m, err
        }
        
       -type TwitchHandler func(http.ResponseWriter, *http.Request) error
       +func BadRequest(w http.ResponseWriter, err string) {
       +        http.Error(w, "400 " + err, http.StatusBadRequest)
       +}
        
        func MakeHandler(h TwitchHandler) func(http.ResponseWriter, *http.Request) {
                return func(w http.ResponseWriter, r *http.Request) {
                        err := r.ParseForm()
                        if err == nil {
                                err = h(w, r)
       +                } else {
       +                        BadRequest(w, "Can't parse form: " + err.Error())
       +                        return
                        }
       +                // unhandled error so far: 500
                        if err != nil {
       -                        w.WriteHeader(500)
       -                        w.Write([]byte("500 " + err.Error()))
       +                        http.Error(w, "500 " + err.Error(), http.StatusInternalServerError)
                        }
                }
        }