说我有这个网址
https://example.com:8080?private-token=foo&authenticity_token=bar
我有一个函数来确定是否要掩盖参数。
如何屏蔽网址,但保持参数顺序。
目前我有
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()
但是这会返回带有已切换参数的网址。
https://example.com:8080?authenticity_token=FILTERED&private-token=FILTERED
答案 0 :(得分:2)
首先,参数的顺序不重要。
但是我可以看到某些情况下该规则不适用(例如,当您对URL进行哈希处理时)。在这种情况下,您应该在使用URL之前对其进行标准化。
最后要回答您的问题,如果使用“查询”,则不能保留顺序,因为“值”是一个映射,并且映射不会打扰排序。因此,您应该使用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()
此代码仅是示例。您必须更好地检查特殊情况或错误。如果需要,还可以使用regexp。