Why url query skip param key value with semicolon ;?

I test nginx, python etc, when query is “a=1;b=2”, will get {‘a’: [‘1;b=2’]} result, but in go get {‘a’: ‘’}

func parseQuery(m Values, query string) (err error) {
	for query != "" {
		var key string
		key, query, _ = strings.Cut(query, "&")
		if strings.Contains(key, ";") {
			err = fmt.Errorf("invalid semicolon separator in query")
			continue
		}
		if key == "" {
			continue
		}
		key, value, _ := strings.Cut(key, "=")
		key, err1 := QueryUnescape(key)
		if err1 != nil {
			if err == nil {
				err = err1
			}
			continue
		}
		value, err1 = QueryUnescape(value)
		if err1 != nil {
			if err == nil {
				err = err1
			}
			continue
		}
		m[key] = append(m[key], value)
	}
	return err
}

Please check the output from your QueryUnescape function. Add some log output to check the result of key vars. I mean, add a log.Println(key, value) after strings.Cut(key, “=”)

Semicolons in a querystring are invalid:

If I were you, I’d use stdlib’s url.ParseQuery:

If you, for some reason wanted to ignore semicolon errors (which is not recommended):