diff --git a/etcdserver/etcdhttp/client.go b/etcdserver/etcdhttp/client.go index bd70a6ffa..fe3142069 100644 --- a/etcdserver/etcdhttp/client.go +++ b/etcdserver/etcdhttp/client.go @@ -205,6 +205,10 @@ func (h *adminMembersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } case "DELETE": idStr := trimPrefix(r.URL.Path, adminMembersPrefix) + if idStr == "" { + http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) + return + } id, err := strconv.ParseUint(idStr, 16, 64) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) diff --git a/etcdserver/etcdhttp/client_test.go b/etcdserver/etcdhttp/client_test.go index c21bf4157..0bb2621f9 100644 --- a/etcdserver/etcdhttp/client_test.go +++ b/etcdserver/etcdhttp/client_test.go @@ -779,6 +779,16 @@ func TestServeAdminMembersFail(t *testing.T) { http.StatusInternalServerError, }, + { + // etcdserver.RemoveMember error + &http.Request{ + URL: mustNewURL(t, adminMembersPrefix), + Method: "DELETE", + }, + nil, + + http.StatusMethodNotAllowed, + }, } for i, tt := range tests { h := &adminMembersHandler{