80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package proxy
|
||
|
||
import (
|
||
"ghproxy/config"
|
||
"net/http"
|
||
|
||
"github.com/infinite-iroha/touka"
|
||
)
|
||
|
||
var (
|
||
respHeadersToRemove = map[string]struct{}{
|
||
"Content-Security-Policy": {},
|
||
"Referrer-Policy": {},
|
||
"Strict-Transport-Security": {},
|
||
"X-Github-Request-Id": {},
|
||
"X-Timer": {},
|
||
"X-Served-By": {},
|
||
"X-Fastly-Request-Id": {},
|
||
}
|
||
|
||
reqHeadersToRemove = map[string]struct{}{
|
||
"CF-IPCountry": {},
|
||
"CF-RAY": {},
|
||
"CF-Visitor": {},
|
||
"CF-Connecting-IP": {},
|
||
"CF-EW-Via": {},
|
||
"CDN-Loop": {},
|
||
"Upgrade": {},
|
||
"Connection": {},
|
||
}
|
||
|
||
cloneHeadersToRemove = map[string]struct{}{
|
||
"CF-IPCountry": {},
|
||
"CF-RAY": {},
|
||
"CF-Visitor": {},
|
||
"CF-Connecting-IP": {},
|
||
"CF-EW-Via": {},
|
||
"CDN-Loop": {},
|
||
}
|
||
)
|
||
|
||
// 预定义headers
|
||
var (
|
||
defaultHeaders = map[string]string{
|
||
"Accept": "*/*",
|
||
"Accept-Encoding": "gzip",
|
||
"Transfer-Encoding": "chunked",
|
||
"User-Agent": "GHProxy/1.0",
|
||
}
|
||
)
|
||
|
||
// copyHeader 将所有头部从 src 复制到 dst。
|
||
// 对于多值头部,它会为每个值调用 Add,从而保留所有值。
|
||
func copyHeader(dst, src http.Header) {
|
||
for k, vv := range src {
|
||
for _, v := range vv {
|
||
dst.Add(k, v)
|
||
}
|
||
}
|
||
}
|
||
|
||
func setRequestHeaders(c *touka.Context, req *http.Request, cfg *config.Config, matcher string) {
|
||
if matcher == "raw" && cfg.Httpc.UseCustomRawHeaders {
|
||
// 使用预定义Header
|
||
for key, value := range defaultHeaders {
|
||
req.Header.Set(key, value)
|
||
}
|
||
} else if matcher == "clone" {
|
||
copyHeader(req.Header, c.Request.Header)
|
||
for key := range cloneHeadersToRemove {
|
||
req.Header.Del(key)
|
||
}
|
||
} else {
|
||
copyHeader(req.Header, c.Request.Header)
|
||
for key := range reqHeadersToRemove {
|
||
req.Header.Del(key)
|
||
}
|
||
}
|
||
}
|