code: func (s *HTTPServer) KVSDelete(resp http.ResponseWriter, req *http.Request, args *structs.KeyRequest) (interface{}, error) {
  	if conflictingFlags(resp, req, "recurse", "cas") {
  		return nil, nil
  	}
  	applyReq := structs.KVSRequest{
  		Datacenter: args.Datacenter,
  		Op:         api.KVDelete,
  		DirEnt: structs.DirEntry{
  			Key: args.Key,
  		},
  	}
  	applyReq.Token = args.Token
  
  	// Check for recurse
  	params := req.URL.Query()
  	if _, ok := params["recurse"]; ok {
  		applyReq.Op = api.KVDeleteTree
  	} else if missingKey(resp, args) {
  		return nil, nil
  	}
  
  	// Check for cas value
  	if _, ok := params["cas"]; ok {
  		casVal, err := strconv.ParseUint(params.Get("cas"), 10, 64)
  		if err != nil {
  			return nil, err
  		}
  		applyReq.DirEnt.ModifyIndex = casVal
  		applyReq.Op = api.KVDeleteCAS
  	}
  
  	// Make the RPC
  	var out bool
  	if err := s.agent.RPC("KVS.Apply", &applyReq, &out); err != nil {
  		return nil, err
  	}
  
  	// Only use the out value if this was a CAS
  	if applyReq.Op == api.KVDeleteCAS {
  		return out, nil
  	}
  	return true, nil
  }
docs: // KVSPut handles a DELETE request