package yu_url import "strings" // Values maps a string key to a list of values. // It is typically used for query parameters and form values. // Unlike in the http.Header map, the keys in a Values map // are case-sensitive. type Values map[string][]string // Get gets the first value associated with the given key. // If there are no values associated with the key, Get returns // the empty string. To access multiple values, use the map // directly. func (v Values) Get(key string) string { vs := v[key] if len(vs) == 0 { return "" } return vs[0] } // Gets gets the first value associated with the given key. // If there are no values associated with the key, Get returns // the empty string. To access multiple values, use the map // directly. func (v Values) Gets(key string) []string { return v[key] } // Set sets the key to value. It replaces any existing // values. func (v Values) Set(key, value string) { v[key] = []string{value} } // Add adds the value to key. It appends to any existing // values associated with key. func (v Values) Add(key, value string) { v[key] = append(v[key], value) } // Del deletes the values associated with key. func (v Values) Del(key string) { delete(v, key) } // Has checks whether a given key is set. func (v Values) Has(key string) bool { _, ok := v[key] return ok } // ParseQuery parses the URL-encoded query string and returns // a map listing the values specified for each key. // ParseQuery always returns a non-nil map containing all the // valid query parameters found; err describes the first decoding error // encountered, if any. // // Query is expected to be a list of key=value settings separated by ampersands. // A setting without an equals sign is interpreted as a key set to an empty // value. // Settings containing a non-URL-encoded semicolon are considered invalid. func ParseQuery(query string) Values { j_maps := make(Values) var j_key string for query != "" { j_key, query, _ = strings.Cut(query, "&") if strings.Contains(j_key, ";") || j_key == "" { continue } j_key, j_value, _ := strings.Cut(j_key, "=") j_key = unescape(j_key, encodeQueryComponent) if j_key == "" { continue } j_value = unescape(j_value, encodeQueryComponent) if j_value == "" { continue } j_maps[j_key] = append(j_maps[j_key], j_value) } return j_maps }