2026-05-22 08:42:27 +08:00
|
|
|
|
package forward
|
|
|
|
|
|
|
|
|
|
|
|
import "net/http"
|
|
|
|
|
|
|
2026-05-27 08:18:36 +08:00
|
|
|
|
// superviseAllowedHeaders 监管通道(28212)允许透传到政务云的 Header 白名单。
|
|
|
|
|
|
// 与 transit-go hy.BuildUpload 组包一致;其余头(Cookie、User-Agent、X-Forward-Token 等)会被剥离。
|
2026-05-22 08:42:27 +08:00
|
|
|
|
var superviseAllowedHeaders = []string{
|
|
|
|
|
|
"Content-Type",
|
|
|
|
|
|
"X-Ca-Appkey",
|
|
|
|
|
|
"X-Ca-Encryption",
|
|
|
|
|
|
"X-Ca-Nonce",
|
|
|
|
|
|
"X-Ca-Timestamp",
|
|
|
|
|
|
"X-Service-Id",
|
|
|
|
|
|
"X-Service-Method",
|
|
|
|
|
|
"X-Ca-Signature",
|
|
|
|
|
|
"requestBody",
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-27 08:18:36 +08:00
|
|
|
|
// fileAllowedHeaders 文件上传通道(28211)允许透传的 Header 白名单。
|
2026-05-22 08:42:27 +08:00
|
|
|
|
var fileAllowedHeaders = []string{
|
|
|
|
|
|
"Content-Type",
|
|
|
|
|
|
"X-Authorization",
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-27 08:18:36 +08:00
|
|
|
|
// allowedHeaderSet 按通道 kind 返回允许头的 CanonicalKey 集合,供 O(1) 查找。
|
2026-05-22 08:42:27 +08:00
|
|
|
|
func allowedHeaderSet(kind string) map[string]struct{} {
|
|
|
|
|
|
list := superviseAllowedHeaders
|
|
|
|
|
|
if kind == "file" {
|
|
|
|
|
|
list = fileAllowedHeaders
|
|
|
|
|
|
}
|
|
|
|
|
|
set := make(map[string]struct{}, len(list))
|
|
|
|
|
|
for _, name := range list {
|
|
|
|
|
|
set[http.CanonicalHeaderKey(name)] = struct{}{}
|
|
|
|
|
|
}
|
|
|
|
|
|
return set
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-27 08:18:36 +08:00
|
|
|
|
// copyAllowedHeaders 将 src 中位于白名单内的头复制到 dst(真实转发与回显模式共用)。
|
2026-05-22 08:42:27 +08:00
|
|
|
|
func copyAllowedHeaders(dst, src http.Header, kind string) {
|
|
|
|
|
|
allow := allowedHeaderSet(kind)
|
|
|
|
|
|
for key, values := range src {
|
|
|
|
|
|
if _, ok := allow[http.CanonicalHeaderKey(key)]; !ok {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, v := range values {
|
|
|
|
|
|
dst.Add(key, v)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|