// Get retrieves the zone configuration for the specified key. If the // key is empty, all zone configurations are returned. Otherwise, the // leading "/" path delimiter is stripped and the zone configuration // matching the remainder is retrieved. Note that this will retrieve // the default zone config if "key" is equal to "/", and will list all // configs if "key" is equal to "". The body result contains // JSON-formatted output for a listing of keys and YAML-formatted // output for retrieval of a zone config. func (zh *zoneHandler) Get(path string, r *http.Request) (body []byte, contentType string, err error) { // Scan all zones if the key is empty. if len(path) == 0 { sr := <-zh.kvDB.Scan(&storage.ScanRequest{ RequestHeader: storage.RequestHeader{ Key: storage.KeyConfigZonePrefix, EndKey: storage.PrefixEndKey(storage.KeyConfigZonePrefix), User: storage.UserRoot, }, MaxResults: maxGetResults, }) if sr.Error != nil { err = sr.Error return } if len(sr.Rows) == maxGetResults { glog.Warningf("retrieved maximum number of results (%d); some may be missing", maxGetResults) } var prefixes []string for _, kv := range sr.Rows { trimmed := bytes.TrimPrefix(kv.Key, storage.KeyConfigZonePrefix) prefixes = append(prefixes, url.QueryEscape(string(trimmed))) } // JSON-encode the prefixes array. contentType = "application/json" if body, err = json.Marshal(prefixes); err != nil { err = util.Errorf("unable to format zone configurations: %v", err) } } else { zoneKey := storage.MakeKey(storage.KeyConfigZonePrefix, storage.Key(path[1:])) var ok bool config := &storage.ZoneConfig{} if ok, _, err = kv.GetI(zh.kvDB, zoneKey, config); err != nil { return } // On get, if there's no zone config for the requested prefix, // return a not found error. if !ok { err = util.Errorf("no config found for key prefix %q", path) return } var out []byte if out, err = yaml.Marshal(config); err != nil { err = util.Errorf("unable to marshal zone config %+v to yaml: %v", config, err) return } if !utf8.ValidString(string(out)) { err = util.Errorf("config contents not valid utf8: %q", out) return } contentType = "text/yaml" body = out } return }
// Get retrieves the zone configuration for the specified key. If the // key is empty, all zone configurations are returned. Otherwise, the // leading "/" path delimiter is stripped and the zone configuration // matching the remainder is retrieved. Note that this will retrieve // the default zone config if "key" is equal to "/", and will list all // configs if "key" is equal to "". The body result contains // JSON-formmatted output via the GetZoneResponse struct. func (zh *zoneHandler) Get(path string, r *http.Request) (body []byte, contentType string, err error) { contentType = "application/json" // Scan all zones if the key is empty. if len(path) == 0 { sr := <-zh.kvDB.Scan(&storage.ScanRequest{ StartKey: storage.KeyConfigZonePrefix, EndKey: storage.PrefixEndKey(storage.KeyConfigZonePrefix), MaxResults: maxGetResults, }) if sr.Error != nil { err = sr.Error return } if len(sr.Rows) == maxGetResults { glog.Warningf("retrieved maximum number of results (%d); some may be missing", maxGetResults) } var prefixes []string for _, kv := range sr.Rows { trimmed := bytes.TrimPrefix(kv.Key, storage.KeyConfigZonePrefix) prefixes = append(prefixes, url.QueryEscape(string(trimmed))) } // JSON-encode the prefixes array. if body, err = json.Marshal(prefixes); err != nil { err = util.Errorf("unable to format zone configurations: %v", err) } } else { zoneKey := storage.MakeKey(storage.KeyConfigZonePrefix, storage.Key(path[1:])) gr := <-zh.kvDB.Get(&storage.GetRequest{Key: zoneKey}) if gr.Error != nil { return } // On get, if there's no zone config for the requested prefix, // return a not found error. if gr.Value.Bytes == nil { err = util.Errorf("no config found for key prefix %q", path) return } if !utf8.ValidString(string(gr.Value.Bytes)) { err = util.Errorf("config contents not valid utf8: %q", gr.Value) return } body = gr.Value.Bytes } return }