in tea/utils/utils.go [32:91]
func BuildCanonicalString(method *string, resource *string, params map[string]*string, headers map[string]*string) (result *string) {
var builder strings.Builder
builder.WriteString(*method + "\n")
headersToSign := make(map[string]string)
// 筛选 headers
for key, value := range headers {
if key != "" {
lowerKey := strings.ToLower(key)
if lowerKey == strings.ToLower(ContentMD5) || lowerKey == strings.ToLower(ContentType) || lowerKey == strings.ToLower(Date) || strings.HasPrefix(lowerKey, PREFIX) {
if value != nil {
headersToSign[lowerKey] = *value
} else {
headersToSign[lowerKey] = ""
}
}
}
}
// 确保 Content-Type 和 Content-MD5 存在
if _, exists := headersToSign[strings.ToLower(ContentType)]; !exists {
headersToSign[strings.ToLower(ContentType)] = ""
}
if _, exists := headersToSign[strings.ToLower(ContentMD5)]; !exists {
headersToSign[strings.ToLower(ContentMD5)] = ""
}
// 添加 params
for key, value := range params {
if strings.HasPrefix(key, PREFIX) {
if value != nil {
headersToSign[key] = *value
} else {
headersToSign[key] = ""
}
}
}
// 按键排序并加入 builder
keys := make([]string, 0, len(headersToSign))
for key := range headersToSign {
keys = append(keys, key)
}
sort.Strings(keys)
for _, key := range keys {
if strings.HasPrefix(key, PREFIX) {
builder.WriteString(key + ":" + headersToSign[key])
} else {
builder.WriteString(headersToSign[key])
}
builder.WriteString("\n")
}
// 添加资源部分
builder.WriteString(buildCanonicalResource(resource, params))
res := builder.String()
return &res
}