Скажем, у меня есть этот URL
https://example.com:8080?private-token=foo&authenticity_token=bar
И у меня есть функция, чтобы определить, нужно ли маскировать параметр.
Как я могу замаскировать URL-адрес, но сохраняя порядок параметров.
В настоящее время у меня есть
u, err := url.Parse(originalURL)
if err != nil {
panic(err)
}
m, _ := url.ParseQuery(u.RawQuery)
for key := range m {
if toMask(key) {
m.Set(key, "FILTERED")
}
}
u.RawQuery = m.Encode()
return u.String()
Но это вернет URL-адрес с переключением параметров.
https://example.com:8080?authenticity_token=FILTERED&private-token=FILTERED
Почему важно, в каком порядке находятся параметры? HTTP-клиенту разрешено отправлять параметры в любом порядке, поэтому сохранение порядка неупорядоченного списка кажется бессмысленным.
Да, это для журналов





Во-первых, порядок параметров не имеет значения.
Но я вижу ситуацию, когда это правило не применяется (например, когда вы хешируете URL). В этом случае вам следует нормализовать URL-адрес перед его использованием.
Наконец, чтобы ответить на ваш вопрос, вы не можете сохранить порядок при использовании Query, поскольку Values - это карта, а карта не беспокоится о порядке. Таким образом, вы должны работать с запросом, используя u.RawQuery.
u, err := url.Parse(originalURL)
if err != nil {
panic(err)
}
newQuery := ""
for i, queryPart := range strings.Split(u.RawQuery, ";") {
// you now have a slice of string ["private-token=foo", "authenticity_token=bar"]
splitParam := strings.Split(queryPart, " = ")
if toMask(splitParam[0]) {
splitParam[1] = "FILTERED"
}
if i != 0 {
newQuery = newQuery + ";"
}
newQuery = splitParam[0] + " = " + splitParam[1]
}
u.RawQuery = newQuery
return u.String()
Этот код - просто пример. Вам лучше проверить наличие особых случаев или ошибок. Вы также можете использовать регулярное выражение, если хотите.
Какова цель маскировки? Чтобы избежать хранения конфиденциальных данных в файлах журнала (или аналогичных)? В этом случае поиск / замена регулярного выражения может помочь ...