50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package forward
|
||
|
||
import "net/http"
|
||
|
||
// superviseAllowedHeaders 监管通道(28212)允许透传到政务云的 Header 白名单。
|
||
// 与 transit-go hy.BuildUpload 组包一致;其余头(Cookie、User-Agent、X-Forward-Token 等)会被剥离。
|
||
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",
|
||
}
|
||
|
||
// fileAllowedHeaders 文件上传通道(28211)允许透传的 Header 白名单。
|
||
var fileAllowedHeaders = []string{
|
||
"Content-Type",
|
||
"X-Authorization",
|
||
}
|
||
|
||
// allowedHeaderSet 按通道 kind 返回允许头的 CanonicalKey 集合,供 O(1) 查找。
|
||
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
|
||
}
|
||
|
||
// copyAllowedHeaders 将 src 中位于白名单内的头复制到 dst(真实转发与回显模式共用)。
|
||
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)
|
||
}
|
||
}
|
||
}
|