github.com/kula/etcd@v0.2.1-0.20131226070625-e96234382ac0/mod/lock/v2/release_handler.go (about) 1 package v2 2 3 import ( 4 "path" 5 "net/http" 6 7 "github.com/gorilla/mux" 8 ) 9 10 // releaseLockHandler deletes the lock. 11 func (h *handler) releaseLockHandler(w http.ResponseWriter, req *http.Request) { 12 h.client.SyncCluster() 13 14 vars := mux.Vars(req) 15 keypath := path.Join(prefix, vars["key"]) 16 17 // Read index and value parameters. 18 index := req.FormValue("index") 19 value := req.FormValue("value") 20 if len(index) == 0 && len(value) == 0 { 21 http.Error(w, "release lock error: index or value required", http.StatusInternalServerError) 22 return 23 } else if len(index) != 0 && len(value) != 0 { 24 http.Error(w, "release lock error: index and value cannot both be specified", http.StatusInternalServerError) 25 return 26 } 27 28 // Look up index by value if index is missing. 29 if len(index) == 0 { 30 resp, err := h.client.Get(keypath, true, true) 31 if err != nil { 32 http.Error(w, "release lock index error: " + err.Error(), http.StatusInternalServerError) 33 return 34 } 35 nodes := lockNodes{resp.Node.Nodes} 36 node, _ := nodes.FindByValue(value) 37 if node == nil { 38 http.Error(w, "release lock error: cannot find: " + value, http.StatusInternalServerError) 39 return 40 } 41 index = path.Base(node.Key) 42 } 43 44 // Delete the lock. 45 _, err := h.client.Delete(path.Join(keypath, index), false) 46 if err != nil { 47 http.Error(w, "release lock error: " + err.Error(), http.StatusInternalServerError) 48 return 49 } 50 } 51