Merge pull request #3550 from fatedier/dev

release v0.51.2
This commit is contained in:
fatedier 2023-07-25 21:35:08 +08:00 committed by GitHub
commit 7c8cbeb250
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 269 additions and 977 deletions

View File

@ -61,7 +61,7 @@ jobs:
echo "TAG_FRPS_GPR=ghcr.io/fatedier/frps:${{ env.TAG_NAME }}" >> $GITHUB_ENV echo "TAG_FRPS_GPR=ghcr.io/fatedier/frps:${{ env.TAG_NAME }}" >> $GITHUB_ENV
- name: Build and push frpc - name: Build and push frpc
uses: docker/build-push-action@v3 uses: docker/build-push-action@v4
with: with:
context: . context: .
file: ./dockerfiles/Dockerfile-for-frpc file: ./dockerfiles/Dockerfile-for-frpc
@ -72,7 +72,7 @@ jobs:
${{ env.TAG_FRPC_GPR }} ${{ env.TAG_FRPC_GPR }}
- name: Build and push frps - name: Build and push frps
uses: docker/build-push-action@v3 uses: docker/build-push-action@v4
with: with:
context: . context: .
file: ./dockerfiles/Dockerfile-for-frps file: ./dockerfiles/Dockerfile-for-frps

View File

@ -14,7 +14,7 @@ jobs:
name: lint name: lint
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/setup-go@v3 - uses: actions/setup-go@v4
with: with:
go-version: '1.20' go-version: '1.20'
- uses: actions/checkout@v3 - uses: actions/checkout@v3
@ -22,7 +22,7 @@ jobs:
uses: golangci/golangci-lint-action@v3 uses: golangci/golangci-lint-action@v3
with: with:
# Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
version: v1.51 version: v1.53
# Optional: golangci-lint command line arguments. # Optional: golangci-lint command line arguments.
# args: --issues-exit-code=0 # args: --issues-exit-code=0

View File

@ -13,7 +13,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Set up Go - name: Set up Go
uses: actions/setup-go@v3 uses: actions/setup-go@v4
with: with:
go-version: '1.20' go-version: '1.20'
@ -22,9 +22,9 @@ jobs:
./package.sh ./package.sh
- name: Run GoReleaser - name: Run GoReleaser
uses: goreleaser/goreleaser-action@v3 uses: goreleaser/goreleaser-action@v4
with: with:
version: latest version: latest
args: release --rm-dist --release-notes=./Release.md args: release --clean --release-notes=./Release.md
env: env:
GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }} GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }}

View File

@ -18,7 +18,7 @@ jobs:
pull-requests: write # for actions/stale to close stale PRs pull-requests: write # for actions/stale to close stale PRs
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v6 - uses: actions/stale@v8
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Issues go stale after 30d of inactivity. Stale issues rot after an additional 7d of inactivity and eventually close.' stale-issue-message: 'Issues go stale after 30d of inactivity. Stale issues rot after an additional 7d of inactivity and eventually close.'

View File

@ -1,4 +1,8 @@
### Features
* Adds a `completion` command for shell completions.
### Fixes ### Fixes
* Fix the issue of not disabling tcp keepalive when configuring `tcp_keepalive` = -1 in frps. * fix a goroutine leak issue caused by Login plugin timeout.
* Fix a race condition error. * Fix an issue introduced in version 0.51.1, enabling `use_compression` will cause some requests to fail.

View File

@ -39,12 +39,12 @@ type GeneralResponse struct {
} }
// /healthz // /healthz
func (svr *Service) healthz(w http.ResponseWriter, r *http.Request) { func (svr *Service) healthz(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(200) w.WriteHeader(200)
} }
// GET /api/reload // GET /api/reload
func (svr *Service) apiReload(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiReload(w http.ResponseWriter, _ *http.Request) {
res := GeneralResponse{Code: 200} res := GeneralResponse{Code: 200}
log.Info("api request [/api/reload]") log.Info("api request [/api/reload]")
@ -74,7 +74,7 @@ func (svr *Service) apiReload(w http.ResponseWriter, r *http.Request) {
} }
// POST /api/stop // POST /api/stop
func (svr *Service) apiStop(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiStop(w http.ResponseWriter, _ *http.Request) {
res := GeneralResponse{Code: 200} res := GeneralResponse{Code: 200}
log.Info("api request [/api/stop]") log.Info("api request [/api/stop]")
@ -124,7 +124,7 @@ func NewProxyStatusResp(status *proxy.WorkingStatus, serverAddr string) ProxySta
} }
// GET /api/status // GET /api/status
func (svr *Service) apiStatus(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiStatus(w http.ResponseWriter, _ *http.Request) {
var ( var (
buf []byte buf []byte
res StatusResp = make(map[string][]ProxyStatusResp) res StatusResp = make(map[string][]ProxyStatusResp)
@ -153,7 +153,7 @@ func (svr *Service) apiStatus(w http.ResponseWriter, r *http.Request) {
} }
// GET /api/config // GET /api/config
func (svr *Service) apiGetConfig(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiGetConfig(w http.ResponseWriter, _ *http.Request) {
res := GeneralResponse{Code: 200} res := GeneralResponse{Code: 200}
log.Info("Http get request [/api/config]") log.Info("Http get request [/api/config]")

View File

@ -124,7 +124,7 @@ func (ctl *Control) Run() {
go ctl.vm.Run() go ctl.vm.Run()
} }
func (ctl *Control) HandleReqWorkConn(inMsg *msg.ReqWorkConn) { func (ctl *Control) HandleReqWorkConn(_ *msg.ReqWorkConn) {
xl := ctl.xl xl := ctl.xl
workConn, err := ctl.connectServer() workConn, err := ctl.connectServer()
if err != nil { if err != nil {

View File

@ -40,7 +40,7 @@ type GeneralTCPProxy struct {
*BaseProxy *BaseProxy
} }
func NewGeneralTCPProxy(baseProxy *BaseProxy, cfg config.ProxyConf) Proxy { func NewGeneralTCPProxy(baseProxy *BaseProxy, _ config.ProxyConf) Proxy {
return &GeneralTCPProxy{ return &GeneralTCPProxy{
BaseProxy: baseProxy, BaseProxy: baseProxy,
} }

View File

@ -142,10 +142,9 @@ func (pxy *BaseProxy) HandleTCPWorkConnection(workConn net.Conn, m *msg.StartWor
return return
} }
} }
var compressionResourceRecycleFn func()
if baseConfig.UseCompression { if baseConfig.UseCompression {
var releaseFn func() remote, compressionResourceRecycleFn = libio.WithCompressionFromPool(remote)
remote, releaseFn = libio.WithCompressionFromPool(remote)
defer releaseFn()
} }
// check if we need to send proxy protocol info // check if we need to send proxy protocol info
@ -215,4 +214,7 @@ func (pxy *BaseProxy) HandleTCPWorkConnection(workConn net.Conn, m *msg.StartWor
if len(errs) > 0 { if len(errs) > 0 {
xl.Trace("join connections errors: %v", errs) xl.Trace("join connections errors: %v", errs)
} }
if compressionResourceRecycleFn != nil {
compressionResourceRecycleFn()
}
} }

View File

@ -77,7 +77,7 @@ func (pxy *SUDPProxy) Close() {
} }
} }
func (pxy *SUDPProxy) InWorkConn(conn net.Conn, m *msg.StartWorkConn) { func (pxy *SUDPProxy) InWorkConn(conn net.Conn, _ *msg.StartWorkConn) {
xl := pxy.xl xl := pxy.xl
xl.Info("incoming a new work connection for sudp proxy, %s", conn.RemoteAddr().String()) xl.Info("incoming a new work connection for sudp proxy, %s", conn.RemoteAddr().String())
@ -97,9 +97,7 @@ func (pxy *SUDPProxy) InWorkConn(conn net.Conn, m *msg.StartWorkConn) {
} }
} }
if pxy.cfg.UseCompression { if pxy.cfg.UseCompression {
var releaseFn func() rwc = libio.WithCompression(rwc)
rwc, releaseFn = libio.WithCompressionFromPool(rwc)
defer releaseFn()
} }
conn = utilnet.WrapReadWriteCloserToConn(rwc, conn) conn = utilnet.WrapReadWriteCloserToConn(rwc, conn)

View File

@ -86,7 +86,7 @@ func (pxy *UDPProxy) Close() {
} }
} }
func (pxy *UDPProxy) InWorkConn(conn net.Conn, m *msg.StartWorkConn) { func (pxy *UDPProxy) InWorkConn(conn net.Conn, _ *msg.StartWorkConn) {
xl := pxy.xl xl := pxy.xl
xl.Info("incoming a new work connection for udp proxy, %s", conn.RemoteAddr().String()) xl.Info("incoming a new work connection for udp proxy, %s", conn.RemoteAddr().String())
// close resources releated with old workConn // close resources releated with old workConn
@ -108,9 +108,7 @@ func (pxy *UDPProxy) InWorkConn(conn net.Conn, m *msg.StartWorkConn) {
} }
} }
if pxy.cfg.UseCompression { if pxy.cfg.UseCompression {
var releaseFn func() rwc = libio.WithCompression(rwc)
rwc, releaseFn = libio.WithCompressionFromPool(rwc)
defer releaseFn()
} }
conn = utilnet.WrapReadWriteCloserToConn(rwc, conn) conn = utilnet.WrapReadWriteCloserToConn(rwc, conn)

View File

@ -378,7 +378,7 @@ func (cm *ConnectionManager) OpenConnection() error {
} }
tlsConfig.NextProtos = []string{"frp"} tlsConfig.NextProtos = []string{"frp"}
conn, err := quic.DialAddrContext( conn, err := quic.DialAddr(
cm.ctx, cm.ctx,
net.JoinHostPort(cm.cfg.ServerAddr, strconv.Itoa(cm.cfg.ServerPort)), net.JoinHostPort(cm.cfg.ServerAddr, strconv.Itoa(cm.cfg.ServerPort)),
tlsConfig, &quic.Config{ tlsConfig, &quic.Config{

View File

@ -126,9 +126,9 @@ func (sv *STCPVisitor) handleConn(userConn net.Conn) {
} }
if sv.cfg.UseCompression { if sv.cfg.UseCompression {
var releaseFn func() var recycleFn func()
remote, releaseFn = libio.WithCompressionFromPool(remote) remote, recycleFn = libio.WithCompressionFromPool(remote)
defer releaseFn() defer recycleFn()
} }
libio.Join(userConn, remote) libio.Join(userConn, remote)

View File

@ -200,9 +200,9 @@ func (sv *XTCPVisitor) handleConn(userConn net.Conn) {
} }
} }
if sv.cfg.UseCompression { if sv.cfg.UseCompression {
var releaseFn func() var recycleFn func()
muxConnRWCloser, releaseFn = libio.WithCompressionFromPool(muxConnRWCloser) muxConnRWCloser, recycleFn = libio.WithCompressionFromPool(muxConnRWCloser)
defer releaseFn() defer recycleFn()
} }
_, _, errs := libio.Join(userConn, muxConnRWCloser) _, _, errs := libio.Join(userConn, muxConnRWCloser)
@ -370,7 +370,7 @@ func (ks *KCPTunnelSession) Init(listenConn *net.UDPConn, raddr *net.UDPAddr) er
return nil return nil
} }
func (ks *KCPTunnelSession) OpenConn(ctx context.Context) (net.Conn, error) { func (ks *KCPTunnelSession) OpenConn(_ context.Context) (net.Conn, error) {
ks.mu.RLock() ks.mu.RLock()
defer ks.mu.RUnlock() defer ks.mu.RUnlock()
session := ks.session session := ks.session
@ -413,7 +413,7 @@ func (qs *QUICTunnelSession) Init(listenConn *net.UDPConn, raddr *net.UDPAddr) e
return fmt.Errorf("create tls config error: %v", err) return fmt.Errorf("create tls config error: %v", err)
} }
tlsConfig.NextProtos = []string{"frp"} tlsConfig.NextProtos = []string{"frp"}
quicConn, err := quic.Dial(listenConn, raddr, raddr.String(), tlsConfig, quicConn, err := quic.Dial(context.Background(), listenConn, raddr, tlsConfig,
&quic.Config{ &quic.Config{
MaxIdleTimeout: time.Duration(qs.clientCfg.QUICMaxIdleTimeout) * time.Second, MaxIdleTimeout: time.Duration(qs.clientCfg.QUICMaxIdleTimeout) * time.Second,
MaxIncomingStreams: int64(qs.clientCfg.QUICMaxIncomingStreams), MaxIncomingStreams: int64(qs.clientCfg.QUICMaxIncomingStreams),

83
go.mod
View File

@ -4,76 +4,81 @@ go 1.20
require ( require (
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
github.com/coreos/go-oidc/v3 v3.4.0 github.com/coreos/go-oidc/v3 v3.6.0
github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb
github.com/fatedier/golib v0.1.1-0.20230720124328-204db2e322f8 github.com/fatedier/golib v0.1.1-0.20230725122706-dcbaee8eef40
github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible
github.com/go-playground/validator/v10 v10.11.0 github.com/go-playground/validator/v10 v10.14.1
github.com/google/uuid v1.3.0 github.com/google/uuid v1.3.0
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
github.com/gorilla/websocket v1.5.0 github.com/gorilla/websocket v1.5.0
github.com/hashicorp/yamux v0.1.1 github.com/hashicorp/yamux v0.1.1
github.com/onsi/ginkgo/v2 v2.8.3 github.com/onsi/ginkgo/v2 v2.11.0
github.com/onsi/gomega v1.27.0 github.com/onsi/gomega v1.27.8
github.com/pion/stun v0.4.0 github.com/pion/stun v0.6.1
github.com/pires/go-proxyproto v0.6.2 github.com/pires/go-proxyproto v0.7.0
github.com/prometheus/client_golang v1.13.0 github.com/prometheus/client_golang v1.16.0
github.com/quic-go/quic-go v0.34.0 github.com/quic-go/quic-go v0.36.2
github.com/rodaine/table v1.0.1 github.com/rodaine/table v1.1.0
github.com/samber/lo v1.38.1 github.com/samber/lo v1.38.1
github.com/spf13/cobra v1.1.3 github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.8.1 github.com/stretchr/testify v1.8.4
golang.org/x/net v0.7.0 golang.org/x/net v0.12.0
golang.org/x/oauth2 v0.3.0 golang.org/x/oauth2 v0.10.0
golang.org/x/sync v0.1.0 golang.org/x/sync v0.3.0
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 golang.org/x/time v0.3.0
gopkg.in/ini.v1 v1.67.0 gopkg.in/ini.v1 v1.67.0
k8s.io/apimachinery v0.26.1 k8s.io/apimachinery v0.27.4
k8s.io/client-go v0.26.1 k8s.io/client-go v0.27.4
) )
require ( require (
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.2.3 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/go-playground/locales v0.14.0 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-logr/logr v1.2.4 // indirect
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/golang/mock v1.6.0 // indirect github.com/golang/mock v1.6.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.4 // indirect github.com/golang/snappy v0.0.4 // indirect
github.com/google/go-cmp v0.5.9 // indirect github.com/google/go-cmp v0.5.9 // indirect
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/klauspost/cpuid/v2 v2.0.6 // indirect github.com/klauspost/cpuid/v2 v2.0.6 // indirect
github.com/klauspost/reedsolomon v1.9.15 // indirect github.com/klauspost/reedsolomon v1.9.15 // indirect
github.com/leodido/go-urn v1.2.1 // indirect github.com/kr/text v0.2.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect
github.com/pion/transport/v2 v2.0.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/pion/dtls/v2 v2.2.7 // indirect
github.com/pion/logging v0.2.2 // indirect
github.com/pion/transport/v2 v2.2.1 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect
github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b // indirect github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect
golang.org/x/crypto v0.4.0 // indirect golang.org/x/crypto v0.11.0 // indirect
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
golang.org/x/mod v0.8.0 // indirect golang.org/x/mod v0.10.0 // indirect
golang.org/x/sys v0.5.0 // indirect golang.org/x/sys v0.10.0 // indirect
golang.org/x/text v0.7.0 // indirect golang.org/x/text v0.11.0 // indirect
golang.org/x/tools v0.6.0 // indirect golang.org/x/tools v0.9.3 // indirect
google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
) )
// TODO(fatedier): Temporary use the modified version, update to the official version after merging into the official repository. // TODO(fatedier): Temporary use the modified version, update to the official version after merging into the official repository.

889
go.sum

File diff suppressed because it is too large Load Diff

View File

@ -527,11 +527,8 @@ func (cfg *TCPProxyConf) ValidateForClient() (err error) {
return return
} }
func (cfg *TCPProxyConf) ValidateForServer(serverCfg ServerCommonConf) error { func (cfg *TCPProxyConf) ValidateForServer(_ ServerCommonConf) error {
if err := cfg.BaseProxyConf.validateForServer(); err != nil { return cfg.BaseProxyConf.validateForServer()
return err
}
return nil
} }
// TCPMux // TCPMux
@ -644,11 +641,8 @@ func (cfg *UDPProxyConf) ValidateForClient() (err error) {
return return
} }
func (cfg *UDPProxyConf) ValidateForServer(serverCfg ServerCommonConf) error { func (cfg *UDPProxyConf) ValidateForServer(_ ServerCommonConf) error {
if err := cfg.BaseProxyConf.validateForServer(); err != nil { return cfg.BaseProxyConf.validateForServer()
return err
}
return nil
} }
// HTTP // HTTP
@ -821,11 +815,8 @@ func (cfg *SUDPProxyConf) ValidateForClient() (err error) {
return nil return nil
} }
func (cfg *SUDPProxyConf) ValidateForServer(serverCfg ServerCommonConf) error { func (cfg *SUDPProxyConf) ValidateForServer(_ ServerCommonConf) error {
if err := cfg.BaseProxyConf.validateForServer(); err != nil { return cfg.BaseProxyConf.validateForServer()
return err
}
return nil
} }
// STCP // STCP
@ -875,11 +866,8 @@ func (cfg *STCPProxyConf) ValidateForClient() (err error) {
return return
} }
func (cfg *STCPProxyConf) ValidateForServer(serverCfg ServerCommonConf) error { func (cfg *STCPProxyConf) ValidateForServer(_ ServerCommonConf) error {
if err := cfg.BaseProxyConf.validateForServer(); err != nil { return cfg.BaseProxyConf.validateForServer()
return err
}
return nil
} }
// XTCP // XTCP
@ -928,9 +916,6 @@ func (cfg *XTCPProxyConf) ValidateForClient() (err error) {
return return
} }
func (cfg *XTCPProxyConf) ValidateForServer(serverCfg ServerCommonConf) error { func (cfg *XTCPProxyConf) ValidateForServer(_ ServerCommonConf) error {
if err := cfg.BaseProxyConf.validateForServer(); err != nil { return cfg.BaseProxyConf.validateForServer()
return err
}
return nil
} }

View File

@ -35,7 +35,7 @@ var (
testProxyPrefix = "test." testProxyPrefix = "test."
) )
func Test_Proxy_Interface(t *testing.T) { func Test_Proxy_Interface(_ *testing.T) {
for name := range proxyConfTypeMap { for name := range proxyConfTypeMap {
NewConfByType(name) NewConfByType(name)
} }

View File

@ -25,7 +25,7 @@ import (
const testVisitorPrefix = "test." const testVisitorPrefix = "test."
func Test_Visitor_Interface(t *testing.T) { func Test_Visitor_Interface(_ *testing.T) {
for name := range visitorConfTypeMap { for name := range visitorConfTypeMap {
DefaultVisitorConf(name) DefaultVisitorConf(name)
} }

View File

@ -129,7 +129,7 @@ func (m *serverMetrics) CloseProxy(name string, proxyType string) {
} }
} }
func (m *serverMetrics) OpenConnection(name string, proxyType string) { func (m *serverMetrics) OpenConnection(name string, _ string) {
m.info.CurConns.Inc(1) m.info.CurConns.Inc(1)
m.mu.Lock() m.mu.Lock()
@ -141,7 +141,7 @@ func (m *serverMetrics) OpenConnection(name string, proxyType string) {
} }
} }
func (m *serverMetrics) CloseConnection(name string, proxyType string) { func (m *serverMetrics) CloseConnection(name string, _ string) {
m.info.CurConns.Dec(1) m.info.CurConns.Dec(1)
m.mu.Lock() m.mu.Lock()
@ -153,7 +153,7 @@ func (m *serverMetrics) CloseConnection(name string, proxyType string) {
} }
} }
func (m *serverMetrics) AddTrafficIn(name string, proxyType string, trafficBytes int64) { func (m *serverMetrics) AddTrafficIn(name string, _ string, trafficBytes int64) {
m.info.TotalTrafficIn.Inc(trafficBytes) m.info.TotalTrafficIn.Inc(trafficBytes)
m.mu.Lock() m.mu.Lock()
@ -166,7 +166,7 @@ func (m *serverMetrics) AddTrafficIn(name string, proxyType string, trafficBytes
} }
} }
func (m *serverMetrics) AddTrafficOut(name string, proxyType string, trafficBytes int64) { func (m *serverMetrics) AddTrafficOut(name string, _ string, trafficBytes int64) {
m.info.TotalTrafficOut.Inc(trafficBytes) m.info.TotalTrafficOut.Inc(trafficBytes)
m.mu.Lock() m.mu.Lock()

View File

@ -29,11 +29,11 @@ func (m *serverMetrics) CloseClient() {
m.clientCount.Dec() m.clientCount.Dec()
} }
func (m *serverMetrics) NewProxy(name string, proxyType string) { func (m *serverMetrics) NewProxy(_ string, proxyType string) {
m.proxyCount.WithLabelValues(proxyType).Inc() m.proxyCount.WithLabelValues(proxyType).Inc()
} }
func (m *serverMetrics) CloseProxy(name string, proxyType string) { func (m *serverMetrics) CloseProxy(_ string, proxyType string) {
m.proxyCount.WithLabelValues(proxyType).Dec() m.proxyCount.WithLabelValues(proxyType).Dec()
} }

View File

@ -45,10 +45,7 @@ func DecodeMessageInto(data, key []byte, m msg.Message) error {
return err return err
} }
if err := msg.ReadMsgInto(bytes.NewReader(buf), m); err != nil { return msg.ReadMsgInto(bytes.NewReader(buf), m)
return err
}
return nil
} }
type ChangedAddress struct { type ChangedAddress struct {

View File

@ -97,7 +97,7 @@ func NewHTTP2HTTPSPlugin(params map[string]string) (Plugin, error) {
return p, nil return p, nil
} }
func (p *HTTP2HTTPSPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (p *HTTP2HTTPSPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, _ []byte) {
wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn) wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn)
_ = p.l.PutConn(wrapConn) _ = p.l.PutConn(wrapConn)
} }
@ -107,8 +107,5 @@ func (p *HTTP2HTTPSPlugin) Name() string {
} }
func (p *HTTP2HTTPSPlugin) Close() error { func (p *HTTP2HTTPSPlugin) Close() error {
if err := p.s.Close(); err != nil { return p.s.Close()
return err
}
return nil
} }

View File

@ -68,7 +68,7 @@ func (hp *HTTPProxy) Name() string {
return PluginHTTPProxy return PluginHTTPProxy
} }
func (hp *HTTPProxy) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (hp *HTTPProxy) Handle(conn io.ReadWriteCloser, realConn net.Conn, _ []byte) {
wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn) wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn)
sc, rd := libnet.NewSharedConn(wrapConn) sc, rd := libnet.NewSharedConn(wrapConn)

View File

@ -122,7 +122,7 @@ func (p *HTTPS2HTTPPlugin) genTLSConfig() (*tls.Config, error) {
return config, nil return config, nil
} }
func (p *HTTPS2HTTPPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (p *HTTPS2HTTPPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, _ []byte) {
wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn) wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn)
_ = p.l.PutConn(wrapConn) _ = p.l.PutConn(wrapConn)
} }
@ -132,8 +132,5 @@ func (p *HTTPS2HTTPPlugin) Name() string {
} }
func (p *HTTPS2HTTPPlugin) Close() error { func (p *HTTPS2HTTPPlugin) Close() error {
if err := p.s.Close(); err != nil { return p.s.Close()
return err
}
return nil
} }

View File

@ -127,7 +127,7 @@ func (p *HTTPS2HTTPSPlugin) genTLSConfig() (*tls.Config, error) {
return config, nil return config, nil
} }
func (p *HTTPS2HTTPSPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (p *HTTPS2HTTPSPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, _ []byte) {
wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn) wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn)
_ = p.l.PutConn(wrapConn) _ = p.l.PutConn(wrapConn)
} }
@ -137,8 +137,5 @@ func (p *HTTPS2HTTPSPlugin) Name() string {
} }
func (p *HTTPS2HTTPSPlugin) Close() error { func (p *HTTPS2HTTPSPlugin) Close() error {
if err := p.s.Close(); err != nil { return p.s.Close()
return err
}
return nil
} }

View File

@ -50,7 +50,7 @@ func NewSocks5Plugin(params map[string]string) (p Plugin, err error) {
return return
} }
func (sp *Socks5Plugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (sp *Socks5Plugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, _ []byte) {
defer conn.Close() defer conn.Close()
wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn) wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn)
_ = sp.Server.ServeConn(wrapConn) _ = sp.Server.ServeConn(wrapConn)

View File

@ -76,7 +76,7 @@ func NewStaticFilePlugin(params map[string]string) (Plugin, error) {
return sp, nil return sp, nil
} }
func (sp *StaticFilePlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (sp *StaticFilePlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, _ []byte) {
wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn) wrapConn := utilnet.WrapReadWriteCloserToConn(conn, realConn)
_ = sp.l.PutConn(wrapConn) _ = sp.l.PutConn(wrapConn)
} }

View File

@ -51,7 +51,7 @@ func NewUnixDomainSocketPlugin(params map[string]string) (p Plugin, err error) {
return return
} }
func (uds *UnixDomainSocketPlugin) Handle(conn io.ReadWriteCloser, realConn net.Conn, extraBufToLocal []byte) { func (uds *UnixDomainSocketPlugin) Handle(conn io.ReadWriteCloser, _ net.Conn, extraBufToLocal []byte) {
localConn, err := net.DialUnix("unix", nil, uds.UnixAddr) localConn, err := net.DialUnix("unix", nil, uds.UnixAddr)
if err != nil { if err != nil {
return return

View File

@ -120,8 +120,5 @@ func (p *httpPlugin) do(ctx context.Context, r *Request, res *Response) error {
if err != nil { if err != nil {
return err return err
} }
if err = json.Unmarshal(buf, res); err != nil { return json.Unmarshal(buf, res)
return err
}
return nil
} }

View File

@ -103,9 +103,7 @@ func NewServerTLSConfig(certPath, keyPath, caPath string) (*tls.Config, error) {
func NewClientTLSConfig(certPath, keyPath, caPath, serverName string) (*tls.Config, error) { func NewClientTLSConfig(certPath, keyPath, caPath, serverName string) (*tls.Config, error) {
base := &tls.Config{} base := &tls.Config{}
if certPath == "" || keyPath == "" { if certPath != "" && keyPath != "" {
// client will not generate tls conf by itself
} else {
cert, err := newCustomTLSKeyPair(certPath, keyPath) cert, err := newCustomTLSKeyPair(certPath, keyPath)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -140,15 +140,15 @@ func (c *FakeUDPConn) RemoteAddr() net.Addr {
return c.remoteAddr return c.remoteAddr
} }
func (c *FakeUDPConn) SetDeadline(t time.Time) error { func (c *FakeUDPConn) SetDeadline(_ time.Time) error {
return nil return nil
} }
func (c *FakeUDPConn) SetReadDeadline(t time.Time) error { func (c *FakeUDPConn) SetReadDeadline(_ time.Time) error {
return nil return nil
} }
func (c *FakeUDPConn) SetWriteDeadline(t time.Time) error { func (c *FakeUDPConn) SetWriteDeadline(_ time.Time) error {
return nil return nil
} }
@ -263,4 +263,4 @@ func (l *UDPListener) Addr() net.Addr {
type ConnectedUDPConn struct{ *net.UDPConn } type ConnectedUDPConn struct{ *net.UDPConn }
// WriteTo redirects all writes to the Write syscall, which is 4 times faster. // WriteTo redirects all writes to the Write syscall, which is 4 times faster.
func (c *ConnectedUDPConn) WriteTo(b []byte, addr net.Addr) (int, error) { return c.Write(b) } func (c *ConnectedUDPConn) WriteTo(b []byte, _ net.Addr) (int, error) { return c.Write(b) }

View File

@ -66,7 +66,7 @@ func (muxer *HTTPConnectTCPMuxer) readHTTPConnectRequest(rd io.Reader) (host, ht
return return
} }
func (muxer *HTTPConnectTCPMuxer) sendConnectResponse(c net.Conn, reqInfo map[string]string) error { func (muxer *HTTPConnectTCPMuxer) sendConnectResponse(c net.Conn, _ map[string]string) error {
if muxer.passthrough { if muxer.passthrough {
return nil return nil
} }

View File

@ -19,7 +19,7 @@ import (
"strings" "strings"
) )
var version = "0.51.1" var version = "0.51.2"
func Full() string { func Full() string {
return version return version

View File

@ -74,10 +74,10 @@ type readOnlyConn struct {
} }
func (conn readOnlyConn) Read(p []byte) (int, error) { return conn.reader.Read(p) } func (conn readOnlyConn) Read(p []byte) (int, error) { return conn.reader.Read(p) }
func (conn readOnlyConn) Write(p []byte) (int, error) { return 0, io.ErrClosedPipe } func (conn readOnlyConn) Write(_ []byte) (int, error) { return 0, io.ErrClosedPipe }
func (conn readOnlyConn) Close() error { return nil } func (conn readOnlyConn) Close() error { return nil }
func (conn readOnlyConn) LocalAddr() net.Addr { return nil } func (conn readOnlyConn) LocalAddr() net.Addr { return nil }
func (conn readOnlyConn) RemoteAddr() net.Addr { return nil } func (conn readOnlyConn) RemoteAddr() net.Addr { return nil }
func (conn readOnlyConn) SetDeadline(t time.Time) error { return nil } func (conn readOnlyConn) SetDeadline(_ time.Time) error { return nil }
func (conn readOnlyConn) SetReadDeadline(t time.Time) error { return nil } func (conn readOnlyConn) SetReadDeadline(_ time.Time) error { return nil }
func (conn readOnlyConn) SetWriteDeadline(t time.Time) error { return nil } func (conn readOnlyConn) SetWriteDeadline(_ time.Time) error { return nil }

View File

@ -29,7 +29,6 @@ import (
"github.com/fatedier/frp/pkg/auth" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/pkg/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/consts"
pkgerr "github.com/fatedier/frp/pkg/errors" pkgerr "github.com/fatedier/frp/pkg/errors"
"github.com/fatedier/frp/pkg/msg" "github.com/fatedier/frp/pkg/msg"
plugin "github.com/fatedier/frp/pkg/plugin/server" plugin "github.com/fatedier/frp/pkg/plugin/server"
@ -55,13 +54,14 @@ func NewControlManager() *ControlManager {
} }
} }
func (cm *ControlManager) Add(runID string, ctl *Control) (oldCtl *Control) { func (cm *ControlManager) Add(runID string, ctl *Control) (old *Control) {
cm.mu.Lock() cm.mu.Lock()
defer cm.mu.Unlock() defer cm.mu.Unlock()
oldCtl, ok := cm.ctlsByRunID[runID] var ok bool
old, ok = cm.ctlsByRunID[runID]
if ok { if ok {
oldCtl.Replaced(ctl) old.Replaced(ctl)
} }
cm.ctlsByRunID[runID] = ctl cm.ctlsByRunID[runID] = ctl
return return
@ -141,14 +141,13 @@ type Control struct {
// replace old controller instantly. // replace old controller instantly.
runID string runID string
// control status
status string
readerShutdown *shutdown.Shutdown readerShutdown *shutdown.Shutdown
writerShutdown *shutdown.Shutdown writerShutdown *shutdown.Shutdown
managerShutdown *shutdown.Shutdown managerShutdown *shutdown.Shutdown
allShutdown *shutdown.Shutdown allShutdown *shutdown.Shutdown
started bool
mu sync.RWMutex mu sync.RWMutex
// Server configuration information // Server configuration information
@ -187,7 +186,6 @@ func NewControl(
portsUsedNum: 0, portsUsedNum: 0,
lastPing: time.Now(), lastPing: time.Now(),
runID: loginMsg.RunID, runID: loginMsg.RunID,
status: consts.Working,
readerShutdown: shutdown.New(), readerShutdown: shutdown.New(),
writerShutdown: shutdown.New(), writerShutdown: shutdown.New(),
managerShutdown: shutdown.New(), managerShutdown: shutdown.New(),
@ -208,11 +206,19 @@ func (ctl *Control) Start() {
Error: "", Error: "",
} }
_ = msg.WriteMsg(ctl.conn, loginRespMsg) _ = msg.WriteMsg(ctl.conn, loginRespMsg)
ctl.mu.Lock()
ctl.started = true
ctl.mu.Unlock()
go ctl.writer() go ctl.writer()
for i := 0; i < ctl.poolCount; i++ { go func() {
ctl.sendCh <- &msg.ReqWorkConn{} for i := 0; i < ctl.poolCount; i++ {
} // ignore error here, that means that this control is closed
_ = errors.PanicToError(func() {
ctl.sendCh <- &msg.ReqWorkConn{}
})
}
}()
go ctl.manager() go ctl.manager()
go ctl.reader() go ctl.reader()
@ -418,6 +424,14 @@ func (ctl *Control) stoper() {
// block until Control closed // block until Control closed
func (ctl *Control) WaitClosed() { func (ctl *Control) WaitClosed() {
ctl.mu.RLock()
started := ctl.started
ctl.mu.RUnlock()
if !started {
ctl.allShutdown.Done()
return
}
ctl.allShutdown.WaitDone() ctl.allShutdown.WaitDone()
} }
@ -434,10 +448,9 @@ func (ctl *Control) manager() {
defer ctl.managerShutdown.Done() defer ctl.managerShutdown.Done()
var heartbeatCh <-chan time.Time var heartbeatCh <-chan time.Time
if ctl.serverCfg.TCPMux || ctl.serverCfg.HeartbeatTimeout <= 0 { // Don't need application heartbeat if TCPMux is enabled,
// Don't need application heartbeat here. // yamux will do same thing.
// yamux will do same thing. if !ctl.serverCfg.TCPMux && ctl.serverCfg.HeartbeatTimeout > 0 {
} else {
heartbeat := time.NewTicker(time.Second) heartbeat := time.NewTicker(time.Second)
defer heartbeat.Stop() defer heartbeat.Stop()
heartbeatCh = heartbeat.C heartbeatCh = heartbeat.C

View File

@ -55,7 +55,7 @@ type serverInfoResp struct {
} }
// /healthz // /healthz
func (svr *Service) Healthz(w http.ResponseWriter, r *http.Request) { func (svr *Service) Healthz(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(200) w.WriteHeader(200)
} }

View File

@ -43,7 +43,7 @@ func (ctl *HTTPGroupController) Register(
return g.Register(proxyName, group, groupKey, routeConfig) return g.Register(proxyName, group, groupKey, routeConfig)
} }
func (ctl *HTTPGroupController) UnRegister(proxyName, group string, routeConfig vhost.RouteConfig) { func (ctl *HTTPGroupController) UnRegister(proxyName, group string, _ vhost.RouteConfig) {
indexKey := group indexKey := group
ctl.mu.Lock() ctl.mu.Lock()
defer ctl.mu.Unlock() defer ctl.mu.Unlock()

View File

@ -27,11 +27,11 @@ func Register(m ServerMetrics) {
type noopServerMetrics struct{} type noopServerMetrics struct{}
func (noopServerMetrics) NewClient() {} func (noopServerMetrics) NewClient() {}
func (noopServerMetrics) CloseClient() {} func (noopServerMetrics) CloseClient() {}
func (noopServerMetrics) NewProxy(name string, proxyType string) {} func (noopServerMetrics) NewProxy(string, string) {}
func (noopServerMetrics) CloseProxy(name string, proxyType string) {} func (noopServerMetrics) CloseProxy(string, string) {}
func (noopServerMetrics) OpenConnection(name string, proxyType string) {} func (noopServerMetrics) OpenConnection(string, string) {}
func (noopServerMetrics) CloseConnection(name string, proxyType string) {} func (noopServerMetrics) CloseConnection(string, string) {}
func (noopServerMetrics) AddTrafficIn(name string, proxyType string, trafficBytes int64) {} func (noopServerMetrics) AddTrafficIn(string, string, int64) {}
func (noopServerMetrics) AddTrafficOut(name string, proxyType string, trafficBytes int64) {} func (noopServerMetrics) AddTrafficOut(string, string, int64) {}

View File

@ -175,9 +175,7 @@ func (pxy *HTTPProxy) GetRealConn(remoteAddr string) (workConn net.Conn, err err
} }
} }
if pxy.cfg.UseCompression { if pxy.cfg.UseCompression {
var releaseFn func() rwc = libio.WithCompression(rwc)
rwc, releaseFn = libio.WithCompressionFromPool(rwc)
defer releaseFn()
} }
if pxy.GetLimiter() != nil { if pxy.GetLimiter() != nil {

View File

@ -241,9 +241,9 @@ func (pxy *BaseProxy) handleUserTCPConnection(userConn net.Conn) {
} }
} }
if cfg.UseCompression { if cfg.UseCompression {
var releaseFn func() var recycleFn func()
local, releaseFn = libio.WithCompressionFromPool(local) local, recycleFn = libio.WithCompressionFromPool(local)
defer releaseFn() defer recycleFn()
} }
if pxy.GetLimiter() != nil { if pxy.GetLimiter() != nil {

View File

@ -70,7 +70,7 @@ type Service struct {
kcpListener net.Listener kcpListener net.Listener
// Accept connections using quic // Accept connections using quic
quicListener quic.Listener quicListener *quic.Listener
// Accept connections using websocket // Accept connections using websocket
websocketListener net.Listener websocketListener net.Listener
@ -499,7 +499,7 @@ func (svr *Service) HandleListener(l net.Listener) {
} }
} }
func (svr *Service) HandleQUICListener(l quic.Listener) { func (svr *Service) HandleQUICListener(l *quic.Listener) {
// Listen for incoming connections from client. // Listen for incoming connections from client.
for { for {
c, err := l.Accept(context.Background()) c, err := l.Accept(context.Background())
@ -552,7 +552,7 @@ func (svr *Service) RegisterControl(ctlConn net.Conn, loginMsg *msg.Login) (err
ctl := NewControl(ctx, svr.rc, svr.pxyManager, svr.pluginManager, svr.authVerifier, ctlConn, loginMsg, svr.cfg) ctl := NewControl(ctx, svr.rc, svr.pxyManager, svr.pluginManager, svr.authVerifier, ctlConn, loginMsg, svr.cfg)
if oldCtl := svr.ctlManager.Add(loginMsg.RunID, ctl); oldCtl != nil { if oldCtl := svr.ctlManager.Add(loginMsg.RunID, ctl); oldCtl != nil {
oldCtl.allShutdown.WaitDone() oldCtl.WaitClosed()
} }
ctl.Start() ctl.Start()

View File

@ -56,10 +56,7 @@ func (m *MockServers) Run() error {
if err := m.udsEchoServer.Run(); err != nil { if err := m.udsEchoServer.Run(); err != nil {
return err return err
} }
if err := m.httpSimpleServer.Run(); err != nil { return m.httpSimpleServer.Run()
return err
}
return nil
} }
func (m *MockServers) Close() { func (m *MockServers) Close() {