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