mirror of
https://github.com/WJQSERVER-STUDIO/ghproxy.git
synced 2026-02-03 00:01:10 +08:00
25w22a
This commit is contained in:
parent
026039e0bc
commit
5501cd3e3c
7 changed files with 96 additions and 10 deletions
|
|
@ -9,7 +9,7 @@ import (
|
|||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/WJQSERVER-STUDIO/go-utils/hwriter"
|
||||
"github.com/WJQSERVER-STUDIO/go-utils/copyb"
|
||||
"github.com/cloudwego/hertz/pkg/app"
|
||||
hresp "github.com/cloudwego/hertz/pkg/protocol/http1/resp"
|
||||
)
|
||||
|
|
@ -130,7 +130,8 @@ func ChunkedProxyRequest(ctx context.Context, c *app.RequestContext, u string, c
|
|||
logInfo("Is Shell: %s %s %s %s %s", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Header.GetProtocol())
|
||||
c.Header("Content-Length", "")
|
||||
|
||||
err := ProcessLinksAndWriteChunked(resp.Body, compress, string(c.Request.Host()), cfg, c)
|
||||
//err := ProcessLinksAndWriteChunked(resp.Body, compress, string(c.Request.Host()), cfg, c)
|
||||
_, err := processLinks(resp.Body, c.Response.BodyWriter(), compress, string(c.Request.Host()), cfg)
|
||||
|
||||
if err != nil {
|
||||
logError("%s %s %s %s %s Failed to copy response body: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Header.GetProtocol(), err)
|
||||
|
|
@ -139,7 +140,9 @@ func ChunkedProxyRequest(ctx context.Context, c *app.RequestContext, u string, c
|
|||
c.Flush() // 确保刷入
|
||||
}
|
||||
} else {
|
||||
err = hwriter.Writer(resp.Body, c)
|
||||
//err = hwriter.Writer(resp.Body, c)
|
||||
//writer := c.Response.BodyWriter()
|
||||
_, err := copyb.Copy(c.Response.BodyWriter(), resp.Body)
|
||||
if err != nil {
|
||||
logError("%s %s %s %s %s Failed to copy response body: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Header.GetProtocol(), err)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import (
|
|||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/WJQSERVER-STUDIO/go-utils/hwriter"
|
||||
"github.com/WJQSERVER-STUDIO/go-utils/copyb"
|
||||
"github.com/cloudwego/hertz/pkg/app"
|
||||
)
|
||||
|
||||
|
|
@ -118,7 +118,8 @@ func GitReq(ctx context.Context, c *app.RequestContext, u string, cfg *config.Co
|
|||
}
|
||||
|
||||
c.Status(resp.StatusCode)
|
||||
err = hwriter.Writer(resp.Body, c)
|
||||
//err = hwriter.Writer(resp.Body, c)
|
||||
_, err = copyb.Copy(c.Response.BodyWriter(), resp.Body)
|
||||
|
||||
if err != nil {
|
||||
logError("%s %s %s %s %s Failed to copy response body: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Header.GetProtocol(), err)
|
||||
|
|
|
|||
|
|
@ -373,3 +373,83 @@ func extractParts(rawURL string) (string, string, string, url.Values, error) {
|
|||
|
||||
return repoOwner, repoName, remainingPath, queryParams, nil
|
||||
}
|
||||
|
||||
// processLinks 处理链接并将结果写入输出流
|
||||
func processLinks(input io.Reader, output io.Writer, compress string, host string, cfg *config.Config) (written int64, err error) {
|
||||
var reader *bufio.Reader
|
||||
|
||||
if compress == "gzip" {
|
||||
// 解压gzip
|
||||
gzipReader, err := gzip.NewReader(input)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("gzip解压错误: %v", err)
|
||||
}
|
||||
defer gzipReader.Close()
|
||||
reader = bufio.NewReader(gzipReader)
|
||||
} else {
|
||||
reader = bufio.NewReader(input)
|
||||
}
|
||||
|
||||
var writer *bufio.Writer
|
||||
var gzipWriter *gzip.Writer
|
||||
|
||||
// 根据是否gzip确定 writer 的创建
|
||||
if compress == "gzip" {
|
||||
gzipWriter = gzip.NewWriter(output)
|
||||
writer = bufio.NewWriterSize(gzipWriter, 4096) //设置缓冲区大小
|
||||
} else {
|
||||
writer = bufio.NewWriterSize(output, 4096)
|
||||
}
|
||||
|
||||
//确保writer关闭
|
||||
defer func() {
|
||||
var closeErr error // 局部变量,用于保存defer中可能发生的错误
|
||||
|
||||
if gzipWriter != nil {
|
||||
if closeErr = gzipWriter.Close(); closeErr != nil {
|
||||
logError("gzipWriter close failed %v", closeErr)
|
||||
// 如果已经存在错误,则保留。否则,记录此错误。
|
||||
if err == nil {
|
||||
err = closeErr
|
||||
}
|
||||
}
|
||||
}
|
||||
if flushErr := writer.Flush(); flushErr != nil {
|
||||
logError("writer flush failed %v", flushErr)
|
||||
// 如果已经存在错误,则保留。否则,记录此错误。
|
||||
if err == nil {
|
||||
err = flushErr
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// 使用正则表达式匹配 http 和 https 链接
|
||||
urlPattern := regexp.MustCompile(`https?://[^\s'"]+`)
|
||||
for {
|
||||
line, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break // 文件结束
|
||||
}
|
||||
return written, fmt.Errorf("读取行错误: %v", err) // 传递错误
|
||||
}
|
||||
|
||||
// 替换所有匹配的 URL
|
||||
modifiedLine := urlPattern.ReplaceAllStringFunc(line, func(originalURL string) string {
|
||||
return modifyURL(originalURL, host, cfg)
|
||||
})
|
||||
|
||||
n, werr := writer.WriteString(modifiedLine)
|
||||
written += int64(n) // 更新写入的字节数
|
||||
if werr != nil {
|
||||
return written, fmt.Errorf("写入文件错误: %v", werr) // 传递错误
|
||||
}
|
||||
}
|
||||
|
||||
// 在返回之前,再刷新一次
|
||||
if fErr := writer.Flush(); fErr != nil {
|
||||
return written, fErr
|
||||
}
|
||||
|
||||
return written, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue