in server/cluster_handler.go [132:195]
func clusterInfoCmd(w http.ResponseWriter, r *http.Request) {
var err error
s := clusterInfoReq{}
ct, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type"))
switch {
case ct == "application/x-www-form-urlencoded", ct == "multipart/form-data", ct == "":
s.Cmd = r.FormValue("cmd")
s.Name = r.FormValue("name")
s.Host = r.FormValue("host")
s.User = r.FormValue("user")
s.Filter = r.FormValue("filter")
s.Pw = r.FormValue("pw")
if r.FormValue("port") != "" {
i, err := strconv.ParseInt(r.FormValue("port"), 10, 16)
if log.E(err) {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
s.Port = uint16(i)
}
if s.Offset, s.Limit, err = parsePagination(r); log.E(err) {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
case ct == "application/json":
if err := json.NewDecoder(r.Body).Decode(&s); log.E(err) {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
default:
code := http.StatusUnsupportedMediaType
http.Error(w, http.StatusText(code), code)
return
}
if s.Cmd == "list" {
err = handleClusterListCmd(w, &s)
} else if len(s.Name) == 0 {
err = errors.New("invalid command. Name cannot be empty")
} else if s.Cmd == "add" {
if len(s.Host) == 0 || len(s.User) == 0 {
err = errors.New("invalid 'add' command. Host and User cannot be empty")
} else {
err = state.InsertClusterInfo(&db.Addr{Name: s.Name, Host: s.Host, Port: s.Port, User: s.User, Pwd: s.Pw})
}
} else if s.Cmd == "del" {
err = state.DeleteClusterInfo(s.Name)
} else if s.Cmd == "pos" {
err = handleClusterPosition(w, s.Name)
} else {
err = errors.New("unknown command (possible commands: add/del)")
}
if err != nil {
if err == sql.ErrNoRows {
http.Error(w, err.Error(), http.StatusNotFound)
} else {
log.Errorf("Cluster http: cmd=%v, name=%v, error=%v", s.Cmd, s.Name, err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
}