diff --git a/CHANGELOG.md b/CHANGELOG.md index 77c5a26..29e7720 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,5 @@ # 更新日志 -4.3.4 - 2025-09-14 ---- -- CHANGE: 改进嵌套加速实现, 增强稳定性 - 4.3.3 - 2025-09-10 --- - CHANGE: 增强对[wanf](https://github.com/WJQSERVER/wanf)的支持 diff --git a/README.md b/README.md index c977c51..cc0847e 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,8 @@ [相关文章](https://blog.wjqserver.com/categories/my-program/) +代理相关推广: [Thordata](https://www.thordata.com/?ls=github&lk=WJQserver),市面上最具性价比的代理服务商,便宜好用,来自全球195个国家城市的6000万IP,轮换住宅/原生ISP/无限量仅从$0.65/GB 起,新用户$1=5GB .联系客户可获得免费测试. + ### 使用示例 ```bash diff --git a/VERSION b/VERSION index a6695ff..2533cac 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.3.4 \ No newline at end of file +4.3.3 \ No newline at end of file diff --git a/proxy/chunkreq.go b/proxy/chunkreq.go index 7e3725e..9227b78 100644 --- a/proxy/chunkreq.go +++ b/proxy/chunkreq.go @@ -127,14 +127,18 @@ func ChunkedProxyRequest(ctx context.Context, c *touka.Context, u string, cfg *c defer bodyReader.Close() if MatcherShell(u) && matchString(matcher) && cfg.Shell.Editor { + // 判断body是不是gzip + var compress string + if resp.Header.Get("Content-Encoding") == "gzip" { + compress = "gzip" + } c.Debugf("Use Shell Editor: %s %s %s %s %s", c.ClientIP(), c.Request.Method, u, c.UserAgent(), c.Request.Proto) - c.DelHeader("Content-Length") - c.DelHeader("Content-Encoding") + c.Header("Content-Length", "") var reader io.Reader - reader, _, err = processLinks(bodyReader, c.Request.Host, cfg, c) + reader, _, err = processLinks(bodyReader, compress, c.Request.Host, cfg, c) c.WriteStream(reader) if err != nil { c.Errorf("%s %s %s %s %s Failed to copy response body: %v", c.ClientIP(), c.Request.Method, u, c.UserAgent(), c.Request.Proto, err) @@ -142,6 +146,7 @@ func ChunkedProxyRequest(ctx context.Context, c *touka.Context, u string, cfg *c return } } else { + if contentLength != "" { c.SetHeader("Content-Length", contentLength) c.WriteStream(bodyReader) diff --git a/proxy/nest.go b/proxy/nest.go index 675e4a3..4f93f20 100644 --- a/proxy/nest.go +++ b/proxy/nest.go @@ -2,6 +2,7 @@ package proxy import ( "bufio" + "compress/gzip" "fmt" "ghproxy/config" "io" @@ -65,7 +66,7 @@ func modifyURL(url string, host string, cfg *config.Config) string { } // processLinks 处理链接,返回包含处理后数据的 io.Reader -func processLinks(input io.ReadCloser, host string, cfg *config.Config, c *touka.Context) (readerOut io.Reader, written int64, err error) { +func processLinks(input io.ReadCloser, compress string, host string, cfg *config.Config, c *touka.Context) (readerOut io.Reader, written int64, err error) { pipeReader, pipeWriter := io.Pipe() // 创建 io.Pipe readerOut = pipeReader @@ -96,14 +97,43 @@ func processLinks(input io.ReadCloser, host string, cfg *config.Config, c *touka var bufReader *bufio.Reader - bufReader = bufio.NewReader(input) + if compress == "gzip" { + // 解压gzip + gzipReader, gzipErr := gzip.NewReader(input) + if gzipErr != nil { + err = fmt.Errorf("gzip解压错误: %v", gzipErr) + return // Goroutine 中使用 return 返回错误 + } + defer gzipReader.Close() + bufReader = bufio.NewReader(gzipReader) + } else { + bufReader = bufio.NewReader(input) + } var bufWriter *bufio.Writer + var gzipWriter *gzip.Writer - bufWriter = bufio.NewWriterSize(pipeWriter, 4096) // 使用 pipeWriter + // 根据是否gzip确定 writer 的创建 + if compress == "gzip" { + gzipWriter = gzip.NewWriter(pipeWriter) // 使用 pipeWriter + bufWriter = bufio.NewWriterSize(gzipWriter, 4096) //设置缓冲区大小 + } else { + bufWriter = bufio.NewWriterSize(pipeWriter, 4096) // 使用 pipeWriter + } //确保writer关闭 defer func() { + var closeErr error // 局部变量,用于保存defer中可能发生的错误 + + if gzipWriter != nil { + if closeErr = gzipWriter.Close(); closeErr != nil { + c.Errorf("gzipWriter close failed %v", closeErr) + // 如果已经存在错误,则保留。否则,记录此错误。 + if err == nil { + err = closeErr + } + } + } if flushErr := bufWriter.Flush(); flushErr != nil { c.Errorf("writer flush failed %v", flushErr) // 如果已经存在错误,则保留。否则,记录此错误。 diff --git a/proxy/reqheader.go b/proxy/reqheader.go index 57d8542..c89dc76 100644 --- a/proxy/reqheader.go +++ b/proxy/reqheader.go @@ -27,7 +27,6 @@ var ( "CDN-Loop": {}, "Upgrade": {}, "Connection": {}, - "Accept-Encoding": {}, } cloneHeadersToRemove = map[string]struct{}{ @@ -44,7 +43,7 @@ var ( var ( defaultHeaders = map[string]string{ "Accept": "*/*", - "Accept-Encoding": "", + "Accept-Encoding": "gzip", "Transfer-Encoding": "chunked", "User-Agent": "GHProxy/1.0", }