mirror of
https://github.com/fatedier/frp.git
synced 2025-04-24 08:41:29 +00:00
Compare commits
3 Commits
62e9d07f48
...
accb71f318
Author | SHA1 | Date | |
---|---|---|---|
|
accb71f318 | ||
|
8b86e1473c | ||
|
b8d3ace113 |
@ -18,10 +18,10 @@ import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
toml "github.com/pelletier/go-toml/v2"
|
||||
"github.com/samber/lo"
|
||||
|
@ -112,6 +112,29 @@ func TestLoadServerConfigStrictMode(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRenderWithTemplate(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
content string
|
||||
want string
|
||||
}{
|
||||
{"toml", tomlServerContent, tomlServerContent},
|
||||
{"yaml", yamlServerContent, yamlServerContent},
|
||||
{"json", jsonServerContent, jsonServerContent},
|
||||
{"template numeric", `key = {{ 123 }}`, "key = 123"},
|
||||
{"template string", `key = {{ "xyz" }}`, "key = xyz"},
|
||||
{"template quote", `key = {{ printf "%q" "with space" }}`, `key = "with space"`},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
require := require.New(t)
|
||||
got, err := RenderWithTemplate([]byte(test.content), nil)
|
||||
require.NoError(err)
|
||||
require.EqualValues(test.want, string(got))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCustomStructStrictMode(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
|
@ -77,7 +77,7 @@ type Service struct {
|
||||
muxer *mux.Mux
|
||||
|
||||
// Accept connections from client
|
||||
listener net.Listener
|
||||
muxListener net.Listener
|
||||
|
||||
// Accept connections using kcp
|
||||
kcpListener net.Listener
|
||||
@ -125,6 +125,11 @@ type Service struct {
|
||||
ctx context.Context
|
||||
// call cancel to stop service
|
||||
cancel context.CancelFunc
|
||||
|
||||
// Track listeners so they can be closed manually
|
||||
vhostHTTPSListener net.Listener
|
||||
tcpmuxHTTPConnectListener net.Listener
|
||||
tcpListener net.Listener
|
||||
}
|
||||
|
||||
func NewService(cfg *v1.ServerConfig) (*Service, error) {
|
||||
@ -180,6 +185,8 @@ func NewService(cfg *v1.ServerConfig) (*Service, error) {
|
||||
return nil, fmt.Errorf("create server listener error, %v", err)
|
||||
}
|
||||
|
||||
// Save listener so it can be closed in svr.Close()
|
||||
svr.tcpmuxHTTPConnectListener = l
|
||||
svr.rc.TCPMuxHTTPConnectMuxer, err = tcpmux.NewHTTPConnectTCPMuxer(l, cfg.TCPMuxPassthrough, vhostReadWriteTimeout)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("create vhost tcpMuxer error, %v", err)
|
||||
@ -226,14 +233,16 @@ func NewService(cfg *v1.ServerConfig) (*Service, error) {
|
||||
return nil, fmt.Errorf("create server listener error, %v", err)
|
||||
}
|
||||
|
||||
// Save listener so it can be closed in svr.Close()
|
||||
svr.tcpListener = ln
|
||||
|
||||
svr.muxer = mux.NewMux(ln)
|
||||
svr.muxer.SetKeepAlive(time.Duration(cfg.Transport.TCPKeepAlive) * time.Second)
|
||||
go func() {
|
||||
_ = svr.muxer.Serve()
|
||||
}()
|
||||
ln = svr.muxer.DefaultListener()
|
||||
|
||||
svr.listener = ln
|
||||
svr.muxListener = ln
|
||||
log.Infof("frps tcp listen on %s", address)
|
||||
|
||||
// Listen for accepting connections from client using kcp protocol.
|
||||
@ -318,7 +327,8 @@ func NewService(cfg *v1.ServerConfig) (*Service, error) {
|
||||
}
|
||||
log.Infof("https service listen on %s", address)
|
||||
}
|
||||
|
||||
// Save listener so it can be closed in svr.Close()
|
||||
svr.vhostHTTPSListener = l
|
||||
svr.rc.VhostHTTPSMuxer, err = vhost.NewHTTPSMuxer(l, vhostReadWriteTimeout)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("create vhost httpsMuxer error, %v", err)
|
||||
@ -374,11 +384,11 @@ func (svr *Service) Run(ctx context.Context) {
|
||||
go svr.sshTunnelGateway.Run()
|
||||
}
|
||||
|
||||
svr.HandleListener(svr.listener, false)
|
||||
svr.HandleListener(svr.muxListener, false)
|
||||
|
||||
<-svr.ctx.Done()
|
||||
// service context may not be canceled by svr.Close(), we should call it here to release resources
|
||||
if svr.listener != nil {
|
||||
if svr.muxListener != nil {
|
||||
svr.Close()
|
||||
}
|
||||
}
|
||||
@ -400,9 +410,25 @@ func (svr *Service) Close() error {
|
||||
svr.tlsListener.Close()
|
||||
svr.tlsConfig = nil
|
||||
}
|
||||
if svr.listener != nil {
|
||||
svr.listener.Close()
|
||||
svr.listener = nil
|
||||
if svr.muxListener != nil {
|
||||
svr.muxListener.Close()
|
||||
svr.muxListener = nil
|
||||
}
|
||||
if svr.vhostHTTPSListener != nil {
|
||||
svr.vhostHTTPSListener.Close()
|
||||
svr.vhostHTTPSListener = nil
|
||||
}
|
||||
if svr.tcpmuxHTTPConnectListener != nil {
|
||||
svr.tcpmuxHTTPConnectListener.Close()
|
||||
svr.tcpmuxHTTPConnectListener = nil
|
||||
}
|
||||
if svr.webServer != nil {
|
||||
svr.webServer.Close()
|
||||
svr.webServer = nil
|
||||
}
|
||||
if svr.tcpListener != nil {
|
||||
svr.tcpListener.Close()
|
||||
svr.tcpListener = nil
|
||||
}
|
||||
svr.ctlManager.Close()
|
||||
if svr.cancel != nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user