From df381e8004b2147f69b272572e982e18c2ec2930 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 20 Apr 2025 16:19:45 +0800 Subject: [PATCH] 1 --- README.md | 1 + config.go | 4 ++++ go.mod | 8 ++++---- go.sum | 24 ++++++++++++------------ http.go | 11 ++++++++++- ws.go | 4 ++-- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 9b9afa5..0ccb90d 100755 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ setting: setting代指下述各配置 - errBanSec: int 当后端错误时(指连接失败,不指后端错误响应),将会禁用若干秒 - insecureSkipVerify: bool 忽略不安全的tls证书 - verifyPeerCer: string 路径,校验服务器证书,使用intermediate_ca +- proxy: string 使用proxy进行请求,支持`socks5:\\`,`http:\\`,`https:\\` - filiter: - reqUri: 请求后端前,请求路径过滤器 diff --git a/config.go b/config.go index 5ad0106..966cf45 100755 --- a/config.go +++ b/config.go @@ -506,6 +506,9 @@ func (t *Back) SwapSign(logger Logger) { } else { t.verifyPeerCer, t.verifyPeerCerErr = os.ReadFile(path) } + if t.Proxy == "" { + t.Proxy = t.route.Proxy + } if t.lastChosenT.IsZero() { t.lastChosenT = time.Now() } @@ -627,6 +630,7 @@ type Setting struct { ErrBanSec int `json:"errBanSec"` InsecureSkipVerify bool `json:"insecureSkipVerify"` VerifyPeerCer string `json:"verifyPeerCer"` + Proxy string `json:"proxy"` Filiter filiter.Filiter `json:"filiter"` Dealer dealer.Dealer `json:"dealer"` verifyPeerCer []byte diff --git a/go.mod b/go.mod index a64185f..a906f96 100755 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.24 require ( github.com/dustin/go-humanize v1.0.1 github.com/gorilla/websocket v1.5.3 - github.com/qydysky/part v0.28.20250328181619 - golang.org/x/net v0.37.0 + github.com/qydysky/part v0.28.20250420070720 + golang.org/x/net v0.39.0 ) require ( @@ -19,8 +19,8 @@ require ( github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.9.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.24.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 924d6a3..3000fd9 100755 --- a/go.sum +++ b/go.sum @@ -27,8 +27,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 h1:k451T+bpsLr+Dq9Ujo+Qtx0iomRA1XXS5ttlEojvfuQ= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9/go.mod h1:cI8/gy/wjy2Eb+p2IUj2ZuDnC8R5Vrx3O0VMPvMvphA= -github.com/qydysky/part v0.28.20250328181619 h1:YaFb1luuYxKoxH7il5non/ILyRL2XGAGWS6Z640QhcM= -github.com/qydysky/part v0.28.20250328181619/go.mod h1:RHYTy8EbqCP6OioVf6BkvFcfWLNO0S220zl0DDlY84Y= +github.com/qydysky/part v0.28.20250420070720 h1:8clOjzYMyRCZkIpW4dvL5BsnHeUujWvdIm1cCfRooGM= +github.com/qydysky/part v0.28.20250420070720/go.mod h1:wp71PQdKYcg9jn9yDDvqC4shS/kzejyvFqbfUxuHocY= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -43,20 +43,20 @@ github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/http.go b/http.go index a7c5f71..995645d 100644 --- a/http.go +++ b/http.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "net/http" + netUrl "net/url" "time" _ "unsafe" @@ -64,6 +65,12 @@ func (httpDealer) Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, InsecureSkipVerify: chosenBack.getInsecureSkipVerify(), } + if chosenBack.Proxy != "" { + customTransport.Proxy = func(_ *http.Request) (*netUrl.URL, error) { + return netUrl.Parse(chosenBack.Proxy) + } + } + if cer, err := chosenBack.getVerifyPeerCer(); err == nil { pool := x509.NewCertPool() if pool.AppendCertsFromPEM(cer) { @@ -154,7 +161,9 @@ func (httpDealer) Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, w.WriteHeader(resp.StatusCode) - if resp.StatusCode < 200 || resp.StatusCode == 204 || resp.StatusCode == 304 { + if resp.StatusCode < 200 || + resp.StatusCode == http.StatusNoContent || + (resp.StatusCode < 400 && resp.StatusCode >= 300) { return nil } diff --git a/ws.go b/ws.go index cf088e7..7888fd9 100644 --- a/ws.go +++ b/ws.go @@ -278,8 +278,8 @@ func DialContext(ctx context.Context, urlStr string, requestHeader http.Header, } // If needed, wrap the dial function to connect through a proxy. - if d.Proxy != nil { - proxyURL, err := d.Proxy(req) + if chosenBack.Proxy != "" { + proxyURL, err := url.Parse(chosenBack.Proxy) if err != nil { return nil, nil, err } -- 2.39.2