diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1aeac..5a8c609 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # 更新日志 +25w33a - 2025-04-29 +--- +- ADD: 实验性的raw Header处置, 用于应对Github对zh-CN的限制 +- FIX: 修正Header部分的一些处理问题 + 3.2.1 - 2025-04-29 --- - FIX: 修复在`HertZ`路由匹配器下`matcher`键值不一致的问题 diff --git a/DEV-VERSION b/DEV-VERSION index f9c9056..23f75d9 100644 --- a/DEV-VERSION +++ b/DEV-VERSION @@ -1 +1 @@ -25w33t-1 \ No newline at end of file +25w33a \ No newline at end of file diff --git a/config/config.go b/config/config.go index ed62121..14c9301 100644 --- a/config/config.go +++ b/config/config.go @@ -50,12 +50,14 @@ mode = "auto" # "auto" or "advanced" maxIdleConns = 100 # only for advanced mode maxIdleConnsPerHost = 60 # only for advanced mode maxConnsPerHost = 0 # only for advanced mode +useCustomRawHeaders = false */ type HttpcConfig struct { Mode string `toml:"mode"` MaxIdleConns int `toml:"maxIdleConns"` MaxIdleConnsPerHost int `toml:"maxIdleConnsPerHost"` MaxConnsPerHost int `toml:"maxConnsPerHost"` + UseCustomRawHeaders bool `toml:"useCustomRawHeaders"` } /* diff --git a/config/config.toml b/config/config.toml index fc47ef1..b43ebf3 100644 --- a/config/config.toml +++ b/config/config.toml @@ -13,6 +13,7 @@ mode = "auto" # "auto" or "advanced" maxIdleConns = 100 # only for advanced mode maxIdleConnsPerHost = 60 # only for advanced mode maxConnsPerHost = 0 # only for advanced mode +useCustomRawHeaders = false [gitclone] mode = "bypass" # bypass / cache diff --git a/proxy/chunkreq.go b/proxy/chunkreq.go index e766a06..22c7b61 100644 --- a/proxy/chunkreq.go +++ b/proxy/chunkreq.go @@ -11,29 +11,6 @@ import ( "github.com/cloudwego/hertz/pkg/app" ) -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": {}, - } -) - func ChunkedProxyRequest(ctx context.Context, c *app.RequestContext, u string, cfg *config.Config, matcher string) { var ( @@ -51,7 +28,7 @@ func ChunkedProxyRequest(ctx context.Context, c *app.RequestContext, u string, c return } - setRequestHeaders(c, req, matcher) + setRequestHeaders(c, req, cfg, matcher) AuthPassThrough(c, cfg, req) resp, err = client.Do(req) diff --git a/proxy/gitreq.go b/proxy/gitreq.go index 2a4b57b..e48598f 100644 --- a/proxy/gitreq.go +++ b/proxy/gitreq.go @@ -13,7 +13,6 @@ import ( func GitReq(ctx context.Context, c *app.RequestContext, u string, cfg *config.Config, mode string) { method := string(c.Request.Method()) - logDump("Url Before FMT:%s", u) if cfg.GitClone.Mode == "cache" { userPath, repoPath, remainingPath, queryParams, err := extractParts(u) if err != nil { @@ -22,7 +21,6 @@ func GitReq(ctx context.Context, c *app.RequestContext, u string, cfg *config.Co } // 构建新url u = cfg.GitClone.SmartGitAddr + userPath + repoPath + remainingPath + "?" + queryParams.Encode() - logDump("New Url After FMT:%s", u) } var ( @@ -35,8 +33,7 @@ func GitReq(ctx context.Context, c *app.RequestContext, u string, cfg *config.Co HandleError(c, fmt.Sprintf("Failed to create request: %v", err)) return } - setRequestHeaders(c, req, "clone") - //removeWSHeader(req) + setRequestHeaders(c, req, cfg, "clone") AuthPassThrough(c, cfg, req) resp, err = gitclient.Do(req) @@ -50,8 +47,7 @@ func GitReq(ctx context.Context, c *app.RequestContext, u string, cfg *config.Co HandleError(c, fmt.Sprintf("Failed to create request: %v", err)) return } - setRequestHeaders(c, req, "clone") - //removeWSHeader(req) + setRequestHeaders(c, req, cfg, "clone") AuthPassThrough(c, cfg, req) resp, err = client.Do(req) diff --git a/proxy/reqheader.go b/proxy/reqheader.go index 24baaae..8400821 100644 --- a/proxy/reqheader.go +++ b/proxy/reqheader.go @@ -1,11 +1,44 @@ package proxy import ( + "ghproxy/config" "net/http" "github.com/cloudwego/hertz/pkg/app" ) +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{ @@ -16,12 +49,20 @@ var ( } ) -func setRequestHeaders(c *app.RequestContext, req *http.Request, matcher string) { - if matcher == "raw" { +func setRequestHeaders(c *app.RequestContext, 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" { + c.Request.Header.VisitAll(func(key, value []byte) { + headerKey := string(key) + headerValue := string(value) + if _, shouldRemove := cloneHeadersToRemove[headerKey]; !shouldRemove { + req.Header.Set(headerKey, headerValue) + } + }) } else { c.Request.Header.VisitAll(func(key, value []byte) { headerKey := string(key)