123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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
- }
|