Compare commits

...

1 Commits
2.0.4 ... 2.0.5

Author SHA1 Message Date
WJQSERVER
5d08993cbc 2.0.5 (#40)
- RELEASE: v2.0.5正式版发布;
- CHANGE: 优化响应体分块复制实现
- ADD: 加入缓存池
- CHANGE: 改进缓存实现
- CHANGE: 部分杂项改进
2025-01-27 15:00:19 +08:00
13 changed files with 56 additions and 59 deletions

View File

@@ -1,5 +1,24 @@
# 更新日志
2.0.5
---
- RELEASE: v2.0.5正式版发布;
- CHANGE: 优化响应体分块复制实现
- ADD: 加入缓存池
- CHANGE: 改进缓存实现
- CHANGE: 部分杂项改进
25w09b
---
- PRE-RELEASE: 此版本是v2.0.5的预发布版本,请勿在生产环境中使用;
- REMOVE: 移除残留配置
25w09a
---
- PRE-RELEASE: 此版本是v2.0.5的预发布版本,请勿在生产环境中使用;
- CHANGE: 改进缓存实现
- ADD: 加入缓存池
2.0.4
---
- RELEASE: v2.0.4正式版发布;

View File

@@ -1 +1 @@
25w08b
25w09b

View File

@@ -83,7 +83,6 @@ wget -O install.sh https://raw.githubusercontent.com/WJQSERVER-STUDIO/ghproxy/ma
host = "0.0.0.0" # 监听地址
port = 8080 # 监听端口
sizeLimit = 125 # 125MB
bufferSize = 4096 # Bytes 缓冲区大小
enableH2C = "on" # 是否开启H2C传输(latest和dev版本请开启) on/off
[pages]

View File

@@ -1 +1 @@
2.0.4
2.0.5

View File

@@ -16,12 +16,11 @@ type Config struct {
}
type ServerConfig struct {
Port int `toml:"port"`
Host string `toml:"host"`
SizeLimit int `toml:"sizeLimit"`
EnableH2C string `toml:"enableH2C"`
BufferSize int `toml:"bufferSize"`
Debug bool `toml:"debug"`
Port int `toml:"port"`
Host string `toml:"host"`
SizeLimit int `toml:"sizeLimit"`
EnableH2C string `toml:"enableH2C"`
Debug bool `toml:"debug"`
}
type PagesConfig struct {

View File

@@ -3,7 +3,6 @@ host = "0.0.0.0"
port = 8080
sizeLimit = 125 # MB
enableH2C = "on" # "on" or "off"
bufferSize = 4096 # Bytes
debug = false
[pages]

View File

@@ -2,7 +2,6 @@
host = "127.0.0.1"
port = 8080
sizeLimit = 125 # MB
bufferSize = 4096 # Bytes
enableH2C = false
debug = false

4
go.mod
View File

@@ -10,7 +10,7 @@ require (
)
require (
github.com/bytedance/sonic v1.12.7 // indirect
github.com/bytedance/sonic v1.12.8 // indirect
github.com/bytedance/sonic/loader v0.2.3 // indirect
github.com/cloudwego/base64x v0.1.5 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
@@ -34,6 +34,6 @@ require (
golang.org/x/net v0.34.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/text v0.21.0 // indirect
google.golang.org/protobuf v1.36.3 // indirect
google.golang.org/protobuf v1.36.4 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

4
go.sum
View File

@@ -4,6 +4,8 @@ github.com/WJQSERVER-STUDIO/go-utils/logger v1.1.1 h1:YS3q54SroxQpEM7c12ZKjLNAaS
github.com/WJQSERVER-STUDIO/go-utils/logger v1.1.1/go.mod h1:oW884JCCPDU6c906LI0uKXndWLiRvjb9LkGYC2cqRO8=
github.com/bytedance/sonic v1.12.7 h1:CQU8pxOy9HToxhndH0Kx/S1qU/CuS9GnKYrGioDcU1Q=
github.com/bytedance/sonic v1.12.7/go.mod h1:tnbal4mxOMju17EGfknm2XyYcpyCnIROYOEYuemj13I=
github.com/bytedance/sonic v1.12.8 h1:4xYRVRlXIgvSZ4e8iVTlMF5szgpXd4AfvuWgA8I8lgs=
github.com/bytedance/sonic v1.12.8/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0=
github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
@@ -82,6 +84,8 @@ golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -92,7 +92,7 @@ func setupRateLimit(cfg *config.Config) {
}
func InitReq() {
proxy.InitReq(cfg.Server.BufferSize)
proxy.InitReq()
}
func init() {

View File

@@ -8,7 +8,6 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100..900&display=swap" rel="stylesheet">
<style>
/* 通用样式 */
:root {
@@ -40,7 +39,7 @@
body {
background-color: var(--background-color);
color: var(--text-color);
font-family: "Noto Sans SC", sans-serif;
font-family: sans-serif;
line-height: 1.8;
font-size: 15px;
margin: 0;

View File

@@ -6,29 +6,29 @@ import (
"ghproxy/config"
"io"
"net/http"
"sync"
"time"
"github.com/gin-gonic/gin"
)
var chunkedBufferSize int
var BufferSize int = 32 * 1024 // 32KB
var (
cclient *http.Client
ctr *http.Transport
cclient *http.Client
ctr *http.Transport
BufferPool *sync.Pool
)
func InitReq(cfgBufferSize int) {
initChunkedBufferSize(cfgBufferSize)
func InitReq() {
initChunkedHTTPClient()
initGitHTTPClient()
}
func initChunkedBufferSize(cfgBufferSize int) {
if cfgBufferSize == 0 {
chunkedBufferSize = 4096 // 默认缓冲区大小
} else {
chunkedBufferSize = cfgBufferSize
// 初始化固定大小的缓存池
BufferPool = &sync.Pool{
New: func() interface{} {
return make([]byte, BufferSize)
},
}
}
@@ -47,9 +47,6 @@ func ChunkedProxyRequest(c *gin.Context, u string, cfg *config.Config, mode stri
method := c.Request.Method
logInfo("%s %s %s %s %s", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Proto)
// 创建HTTP客户端
//client := &http.Client{}
// 发送HEAD请求, 预获取Content-Length
headReq, err := http.NewRequest("HEAD", u, nil)
if err != nil {
@@ -108,28 +105,15 @@ func ChunkedProxyRequest(c *gin.Context, u string, cfg *config.Config, mode stri
c.Status(resp.StatusCode)
if err := chunkedCopyResponseBody(c, resp.Body); err != nil {
logError("%s %s %s %s %s 响应复制错误: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Proto, err)
}
}
// 使用固定32KB缓冲池
buffer := BufferPool.Get().([]byte)
defer BufferPool.Put(buffer)
// 复制响应体
func chunkedCopyResponseBody(c *gin.Context, respBody io.Reader) error {
buf := make([]byte, chunkedBufferSize)
for {
n, err := respBody.Read(buf)
if n > 0 {
if _, err := c.Writer.Write(buf[:n]); err != nil {
return err
}
c.Writer.Flush() // 确保每次写入后刷新
}
if err != nil {
if err == io.EOF {
break
}
return err
}
_, err = io.CopyBuffer(c.Writer, resp.Body, buffer)
if err != nil {
logError("%s %s %s %s %s 响应复制错误: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Proto, err)
return
} else {
c.Writer.Flush() // 确保刷入
}
return nil
}

View File

@@ -86,13 +86,8 @@ func GitReq(c *gin.Context, u string, cfg *config.Config, mode string, runMode s
CopyResponseHeaders(resp, c, cfg)
c.Status(resp.StatusCode)
if err := gitCopyResponseBody(c, resp.Body); err != nil {
if _, err := io.Copy(c.Writer, resp.Body); err != nil {
logError("%s %s %s %s %s Response-Copy-Error: %v", c.ClientIP(), method, u, c.Request.Header.Get("User-Agent"), c.Request.Proto, err)
}
}
// 复制响应体
func gitCopyResponseBody(c *gin.Context, respBody io.Reader) error {
_, err := io.Copy(c.Writer, respBody)
return err
}