This commit is contained in:
2026-07-25 14:18:14 +08:00
parent cc2513652e
commit fa55098520
7 changed files with 216 additions and 58 deletions

View File

@@ -1,6 +1,18 @@
package yuyuecha
import "strings"
import (
"sort"
"strings"
)
// 签名头固定顺序,便于阅读与对比
var preferredHeaderOrder = []string{
"Content-Type",
"clientId",
"timestamp",
"nonce",
"signature",
}
// generateCurlCommand 生成可复现的 curl 命令,便于数据源排查
func generateCurlCommand(method, url string, headers map[string]string, body string) string {
@@ -11,11 +23,11 @@ func generateCurlCommand(method, url string, headers map[string]string, body str
cmd.WriteString(url)
cmd.WriteString("'")
for key, value := range headers {
for _, key := range orderedHeaderKeys(headers) {
cmd.WriteString(" \\\n -H '")
cmd.WriteString(escapeShellSingleQuote(key))
cmd.WriteString(": ")
cmd.WriteString(escapeShellSingleQuote(value))
cmd.WriteString(escapeShellSingleQuote(headers[key]))
cmd.WriteString("'")
}
@@ -28,6 +40,25 @@ func generateCurlCommand(method, url string, headers map[string]string, body str
return cmd.String()
}
func orderedHeaderKeys(headers map[string]string) []string {
seen := make(map[string]struct{}, len(headers))
keys := make([]string, 0, len(headers))
for _, key := range preferredHeaderOrder {
if _, ok := headers[key]; ok {
keys = append(keys, key)
seen[key] = struct{}{}
}
}
rest := make([]string, 0, len(headers))
for key := range headers {
if _, ok := seen[key]; !ok {
rest = append(rest, key)
}
}
sort.Strings(rest)
return append(keys, rest...)
}
func escapeShellSingleQuote(s string) string {
return strings.ReplaceAll(s, "'", `'\''`)
}