Mercurial > gemma
view controllers/json.go @ 249:e0f47d9ebde0
Hotfix: changed login call back to GET from POST.
For some reason POST didn't work as intended: the credentials were not
send... This is only a workaround, as POST would still be the right
way to go...
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Fri, 27 Jul 2018 11:04:20 +0200 |
parents | 3b688fe04c39 |
children | dfc2b035e055 |
line wrap: on
line source
package controllers import ( "database/sql" "encoding/json" "fmt" "log" "net/http" "github.com/jackc/pgx" "gemma.intevation.de/gemma/auth" ) type JSONResult struct { Code int Result interface{} } type JSONHandler struct { Input func() interface{} Handle func(http.ResponseWriter, *http.Request, interface{}, *sql.DB) (JSONResult, error) } type JSONError struct { Code int Message string } func (je JSONError) Error() string { return fmt.Sprintf("%d: %s", je.Code, je.Message) } func (j *JSONHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { var input interface{} if j.Input != nil { input = j.Input() defer req.Body.Close() if err := json.NewDecoder(req.Body).Decode(input); err != nil { http.Error(rw, "error: "+err.Error(), http.StatusBadRequest) return } } token, _ := auth.GetToken(req) var jr JSONResult err := auth.ConnPool.Do(token, func(db *sql.DB) (err error) { jr, err = j.Handle(rw, req, input, db) return err }) if err != nil { switch e := err.(type) { case pgx.PgError: var res = struct { Result string `json:"result"` Code string `json:"code"` Message string `json:"message"` }{ Result: "failure", Code: e.Code, Message: e.Message, } rw.Header().Set("Content-Type", "application/json") rw.WriteHeader(http.StatusInternalServerError) if err := json.NewEncoder(rw).Encode(&res); err != nil { log.Printf("error: %v\n", err) } case JSONError: rw.Header().Set("Content-Type", "application/json") rw.WriteHeader(http.StatusInternalServerError) var res = struct { Message string `json:"message"` }{ Message: e.Message, } if err := json.NewEncoder(rw).Encode(&res); err != nil { log.Printf("error: %v\n", err) } default: log.Printf("err: %v\n", err) http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError) } return } if jr.Code == 0 { jr.Code = http.StatusOK } if jr.Code != http.StatusNoContent { rw.Header().Set("Content-Type", "application/json") } rw.WriteHeader(jr.Code) if jr.Code != http.StatusNoContent { if err := json.NewEncoder(rw).Encode(jr.Result); err != nil { log.Printf("error: %v\n", err) } } }