// Handle API add service requests func (s *Server) addServiceHTTPHandler(w http.ResponseWriter, req *http.Request) { addServiceCount.Inc(1) vars := mux.Vars(req) var uuid string var ok bool var secret string //read the authorization header to get the secret. secret = req.Header.Get("Authorization") if err := s.authenticate(secret); err != nil { http.Error(w, err.Error(), http.StatusForbidden) return } if uuid, ok = vars["uuid"]; !ok { http.Error(w, "UUID required", http.StatusBadRequest) return } var serv msg.Service if err := json.NewDecoder(req.Body).Decode(&serv); err != nil { log.Println("Error: ", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } if serv.Host == "" || serv.Port == 0 { http.Error(w, "Host and Port required", http.StatusBadRequest) return } serv.UUID = uuid if _, err := s.raftServer.Do(NewAddServiceCommand(serv)); err != nil { switch err { case registry.ErrExists: http.Error(w, err.Error(), http.StatusConflict) case raft.NotLeaderError: s.redirectToLeader(w, req) default: log.Println("Error: ", err) http.Error(w, err.Error(), http.StatusInternalServerError) } return } w.WriteHeader(http.StatusCreated) }