diff --git a/config/parsing/parse.go b/config/parsing/parse.go index 2c2a301..c82d9d6 100644 --- a/config/parsing/parse.go +++ b/config/parsing/parse.go @@ -36,6 +36,10 @@ const ( mdKeyInterface = "interface" mdKeySoMark = "so_mark" mdKeyHash = "hash" + mdKeyPreUp = "preUp" + mdKeyPreDown = "preDown" + mdKeyPostUp = "postUp" + mdKeyPostDown = "postDown" ) func ParseAuther(cfg *config.AutherConfig) auth.Authenticator { diff --git a/config/parsing/service.go b/config/parsing/service.go index 1552b12..518b651 100644 --- a/config/parsing/service.go +++ b/config/parsing/service.go @@ -81,6 +81,7 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) { var ppv int ifce := cfg.Interface + var preUp, preDown, postUp, postDown []string if cfg.Metadata != nil { md := metadata.NewMetadata(cfg.Metadata) ppv = mdutil.GetInt(md, mdKeyProxyProtocol) @@ -92,6 +93,10 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) { Mark: v, } } + preUp = mdutil.GetStrings(md, mdKeyPreUp) + preDown = mdutil.GetStrings(md, mdKeyPreDown) + postUp = mdutil.GetStrings(md, mdKeyPostUp) + postDown = mdutil.GetStrings(md, mdKeyPostDown) } var ln listener.Listener @@ -204,6 +209,10 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) { s := xservice.NewService(cfg.Name, ln, h, xservice.AdmissionOption(admission.AdmissionGroup(admissions...)), xservice.LoggerOption(serviceLogger), + xservice.PreUpOption(preUp), + xservice.PreDownOption(preDown), + xservice.PostUpOption(postUp), + xservice.PostDownOption(postDown), ) serviceLogger.Infof("listening on %s/%s", s.Addr().String(), s.Addr().Network()) diff --git a/dialer/http3/dialer.go b/dialer/http3/dialer.go index f448be9..fd8f714 100644 --- a/dialer/http3/dialer.go +++ b/dialer/http3/dialer.go @@ -86,6 +86,15 @@ func (d *http3Dialer) Dial(ctx context.Context, addr string, opts ...dialer.Dial return quic.DialEarly(udpConn.(net.PacketConn), udpAddr, host, tlsCfg, cfg) }, + QuicConfig: &quic.Config{ + KeepAlivePeriod: d.md.keepAlivePeriod, + HandshakeIdleTimeout: d.md.handshakeTimeout, + MaxIdleTimeout: d.md.maxIdleTimeout, + Versions: []quic.VersionNumber{ + quic.Version1, + }, + MaxIncomingStreams: int64(d.md.maxStreams), + }, }, }, AuthorizePath: d.md.authorizePath, diff --git a/dialer/http3/metadata.go b/dialer/http3/metadata.go index 14a5b82..41ed700 100644 --- a/dialer/http3/metadata.go +++ b/dialer/http3/metadata.go @@ -9,22 +9,22 @@ import ( ) const ( - dialTimeout = "dialTimeout" defaultAuthorizePath = "/authorize" defaultPushPath = "/push" defaultPullPath = "/pull" ) -const ( - defaultDialTimeout = 5 * time.Second -) - type metadata struct { - dialTimeout time.Duration authorizePath string pushPath string pullPath string host string + + // QUIC config options + keepAlivePeriod time.Duration + maxIdleTimeout time.Duration + handshakeTimeout time.Duration + maxStreams int } func (d *http3Dialer) parseMetadata(md mdata.Metadata) (err error) { @@ -33,6 +33,12 @@ func (d *http3Dialer) parseMetadata(md mdata.Metadata) (err error) { pushPath = "pushPath" pullPath = "pullPath" host = "host" + + keepAlive = "keepAlive" + keepAlivePeriod = "ttl" + handshakeTimeout = "handshakeTimeout" + maxIdleTimeout = "maxIdleTimeout" + maxStreams = "maxStreams" ) d.md.authorizePath = mdutil.GetString(md, authorizePath) @@ -49,5 +55,15 @@ func (d *http3Dialer) parseMetadata(md mdata.Metadata) (err error) { } d.md.host = mdutil.GetString(md, host) + if !md.IsExists(keepAlive) || mdutil.GetBool(md, keepAlive) { + d.md.keepAlivePeriod = mdutil.GetDuration(md, keepAlivePeriod) + if d.md.keepAlivePeriod <= 0 { + d.md.keepAlivePeriod = 10 * time.Second + } + } + d.md.handshakeTimeout = mdutil.GetDuration(md, handshakeTimeout) + d.md.maxIdleTimeout = mdutil.GetDuration(md, maxIdleTimeout) + d.md.maxStreams = mdutil.GetInt(md, maxStreams) + return } diff --git a/dialer/pht/dialer.go b/dialer/pht/dialer.go index 2bb2444..0398b2f 100644 --- a/dialer/pht/dialer.go +++ b/dialer/pht/dialer.go @@ -8,7 +8,6 @@ import ( "time" "github.com/go-gost/core/dialer" - "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" pht_util "github.com/go-gost/x/internal/util/pht" "github.com/go-gost/x/registry" @@ -24,7 +23,6 @@ type phtDialer struct { clientMutex sync.Mutex tlsEnabled bool md metadata - logger logger.Logger options dialer.Options } diff --git a/dialer/pht/metadata.go b/dialer/pht/metadata.go index 611a991..b7526ba 100644 --- a/dialer/pht/metadata.go +++ b/dialer/pht/metadata.go @@ -2,7 +2,6 @@ package pht import ( "strings" - "time" mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" @@ -15,12 +14,7 @@ const ( defaultPullPath = "/pull" ) -const ( - defaultDialTimeout = 5 * time.Second -) - type metadata struct { - dialTimeout time.Duration authorizePath string pushPath string pullPath string diff --git a/dialer/quic/dialer.go b/dialer/quic/dialer.go index c01fef9..404ee7e 100644 --- a/dialer/quic/dialer.go +++ b/dialer/quic/dialer.go @@ -110,6 +110,7 @@ func (d *quicDialer) initSession(ctx context.Context, addr net.Addr, conn net.Pa quic.Version1, quic.VersionDraft29, }, + MaxIncomingStreams: int64(d.md.maxStreams), } tlsCfg := d.options.TLSConfig diff --git a/dialer/quic/metadata.go b/dialer/quic/metadata.go index c798652..8b6e87b 100644 --- a/dialer/quic/metadata.go +++ b/dialer/quic/metadata.go @@ -11,6 +11,7 @@ type metadata struct { keepAlivePeriod time.Duration maxIdleTimeout time.Duration handshakeTimeout time.Duration + maxStreams int cipherKey []byte } @@ -21,6 +22,7 @@ func (d *quicDialer) parseMetadata(md mdata.Metadata) (err error) { keepAlivePeriod = "ttl" handshakeTimeout = "handshakeTimeout" maxIdleTimeout = "maxIdleTimeout" + maxStreams = "maxStreams" cipherKey = "cipherKey" ) @@ -29,7 +31,7 @@ func (d *quicDialer) parseMetadata(md mdata.Metadata) (err error) { d.md.cipherKey = []byte(key) } - if mdutil.GetBool(md, keepAlive) { + if !md.IsExists(keepAlive) || mdutil.GetBool(md, keepAlive) { d.md.keepAlivePeriod = mdutil.GetDuration(md, keepAlivePeriod) if d.md.keepAlivePeriod <= 0 { d.md.keepAlivePeriod = 10 * time.Second @@ -37,6 +39,7 @@ func (d *quicDialer) parseMetadata(md mdata.Metadata) (err error) { } d.md.handshakeTimeout = mdutil.GetDuration(md, handshakeTimeout) d.md.maxIdleTimeout = mdutil.GetDuration(md, maxIdleTimeout) + d.md.maxStreams = mdutil.GetInt(md, maxStreams) return } diff --git a/go.mod b/go.mod index 915eb5a..29237bd 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/gobwas/glob v0.2.3 github.com/golang/snappy v0.0.4 github.com/gorilla/websocket v1.5.0 - github.com/lucas-clemente/quic-go v0.29.0 + github.com/lucas-clemente/quic-go v0.30.0 github.com/miekg/dns v1.1.50 github.com/pires/go-proxyproto v0.6.2 github.com/prometheus/client_golang v1.12.1 @@ -37,7 +37,7 @@ require ( golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 google.golang.org/grpc v1.49.0 - google.golang.org/protobuf v1.27.1 + google.golang.org/protobuf v1.28.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -56,23 +56,23 @@ require ( github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/gopacket v1.1.19 // indirect + github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid v1.3.1 // indirect github.com/klauspost/reedsolomon v1.9.9 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/magiconair/properties v1.8.6 // indirect - github.com/marten-seemann/qpack v0.2.1 // indirect - github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect - github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect + github.com/marten-seemann/qpack v0.3.0 // indirect + github.com/marten-seemann/qtls-go1-18 v0.1.3 // indirect + github.com/marten-seemann/qtls-go1-19 v0.1.1 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/mapstructure v1.4.3 // indirect github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/ginkgo/v2 v2.2.0 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect @@ -96,5 +96,4 @@ require ( golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350 // indirect gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect ) diff --git a/go.sum b/go.sum index 4040cb1..1f03a41 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,6 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -196,6 +194,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -208,7 +208,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -245,16 +244,16 @@ github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdA github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lucas-clemente/quic-go v0.29.0 h1:Vw0mGTfmWqGzh4jx/kMymsIkFK6rErFVmg+t9RLrnZE= -github.com/lucas-clemente/quic-go v0.29.0/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE= +github.com/lucas-clemente/quic-go v0.30.0 h1:nwLW0h8ahVQ5EPTIM7uhl/stHqQDea15oRlYKZmw2O0= +github.com/lucas-clemente/quic-go v0.30.0/go.mod h1:ssOrRsOmdxa768Wr78vnh2B8JozgLsMzG/g+0qEC7uk= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= -github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= -github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= +github.com/marten-seemann/qpack v0.3.0 h1:UiWstOgT8+znlkDPOg2+3rIuYXJ2CnGDkGUXN6ki6hE= +github.com/marten-seemann/qpack v0.3.0/go.mod h1:cGfKPBiP4a9EQdxCwEwI/GEeWAsjSekBvx/X8mh58+g= +github.com/marten-seemann/qtls-go1-18 v0.1.3 h1:R4H2Ks8P6pAtUagjFty2p7BVHn3XiwDAl7TTQf5h7TI= +github.com/marten-seemann/qtls-go1-18 v0.1.3/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= +github.com/marten-seemann/qtls-go1-19 v0.1.1 h1:mnbxeq3oEyQxQXwI4ReCgW9DPoPR94sNlqWoDZnjRIE= +github.com/marten-seemann/qtls-go1-19 v0.1.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= @@ -276,17 +275,11 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI= +github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pires/go-proxyproto v0.6.2 h1:KAZ7UteSOt6urjme6ZldyFm4wDe/z0ZUP0Yv0Dos0d8= @@ -456,7 +449,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVD golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -479,7 +471,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -519,7 +510,6 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -532,11 +522,8 @@ golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -552,7 +539,6 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -563,7 +549,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -643,7 +628,6 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= @@ -757,8 +741,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -766,13 +751,11 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -783,8 +766,8 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/listener/http3/listener.go b/listener/http3/listener.go index 97cf7f1..2fb3054 100644 --- a/listener/http3/listener.go +++ b/listener/http3/listener.go @@ -55,7 +55,15 @@ func (l *http3Listener) Init(md md.Metadata) (err error) { l.server = pht_util.NewHTTP3Server( l.options.Addr, - &quic.Config{}, + &quic.Config{ + KeepAlivePeriod: l.md.keepAlivePeriod, + HandshakeIdleTimeout: l.md.handshakeTimeout, + MaxIdleTimeout: l.md.maxIdleTimeout, + Versions: []quic.VersionNumber{ + quic.Version1, + }, + MaxIncomingStreams: int64(l.md.maxStreams), + }, pht_util.TLSConfigServerOption(l.options.TLSConfig), pht_util.BacklogServerOption(l.md.backlog), pht_util.PathServerOption(l.md.authorizePath, l.md.pushPath, l.md.pullPath), diff --git a/listener/http3/metadata.go b/listener/http3/metadata.go index b901708..cd08a36 100644 --- a/listener/http3/metadata.go +++ b/listener/http3/metadata.go @@ -2,6 +2,7 @@ package http3 import ( "strings" + "time" mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" @@ -19,6 +20,12 @@ type metadata struct { pushPath string pullPath string backlog int + + // QUIC config options + keepAlivePeriod time.Duration + maxIdleTimeout time.Duration + handshakeTimeout time.Duration + maxStreams int } func (l *http3Listener) parseMetadata(md mdata.Metadata) (err error) { @@ -27,6 +34,12 @@ func (l *http3Listener) parseMetadata(md mdata.Metadata) (err error) { pushPath = "pushPath" pullPath = "pullPath" + keepAlive = "keepAlive" + keepAlivePeriod = "ttl" + handshakeTimeout = "handshakeTimeout" + maxIdleTimeout = "maxIdleTimeout" + maxStreams = "maxStreams" + backlog = "backlog" ) @@ -48,5 +61,15 @@ func (l *http3Listener) parseMetadata(md mdata.Metadata) (err error) { l.md.backlog = defaultBacklog } + if mdutil.GetBool(md, keepAlive) { + l.md.keepAlivePeriod = mdutil.GetDuration(md, keepAlivePeriod) + if l.md.keepAlivePeriod <= 0 { + l.md.keepAlivePeriod = 10 * time.Second + } + } + l.md.handshakeTimeout = mdutil.GetDuration(md, handshakeTimeout) + l.md.maxIdleTimeout = mdutil.GetDuration(md, maxIdleTimeout) + l.md.maxStreams = mdutil.GetInt(md, maxStreams) + return } diff --git a/listener/quic/listener.go b/listener/quic/listener.go index fd0997f..059ca7b 100644 --- a/listener/quic/listener.go +++ b/listener/quic/listener.go @@ -77,6 +77,7 @@ func (l *quicListener) Init(md md.Metadata) (err error) { quic.Version1, quic.VersionDraft29, }, + MaxIncomingStreams: int64(l.md.maxStreams), } tlsCfg := l.options.TLSConfig diff --git a/listener/quic/metadata.go b/listener/quic/metadata.go index 942e918..eca8903 100644 --- a/listener/quic/metadata.go +++ b/listener/quic/metadata.go @@ -16,6 +16,7 @@ type metadata struct { keepAlivePeriod time.Duration handshakeTimeout time.Duration maxIdleTimeout time.Duration + maxStreams int cipherKey []byte backlog int @@ -27,6 +28,7 @@ func (l *quicListener) parseMetadata(md mdata.Metadata) (err error) { keepAlivePeriod = "ttl" handshakeTimeout = "handshakeTimeout" maxIdleTimeout = "maxIdleTimeout" + maxStreams = "maxStreams" backlog = "backlog" cipherKey = "cipherKey" @@ -49,6 +51,7 @@ func (l *quicListener) parseMetadata(md mdata.Metadata) (err error) { } l.md.handshakeTimeout = mdutil.GetDuration(md, handshakeTimeout) l.md.maxIdleTimeout = mdutil.GetDuration(md, maxIdleTimeout) + l.md.maxStreams = mdutil.GetInt(md, maxStreams) return } diff --git a/listener/tun/tun.go b/listener/tun/tun.go index 6c8d21a..343f6be 100644 --- a/listener/tun/tun.go +++ b/listener/tun/tun.go @@ -50,7 +50,9 @@ func (l *tunListener) createTunDevice() (dev io.ReadWriteCloser, name string, er return } - dev = &tunDevice{dev: ifce} + dev = &tunDevice{ + dev: ifce, + } name, err = ifce.Name() return diff --git a/registry/admission.go b/registry/admission.go index 3fffb28..5168f59 100644 --- a/registry/admission.go +++ b/registry/admission.go @@ -5,7 +5,7 @@ import ( ) type admissionRegistry struct { - registry + registry[admission.Admission] } func (r *admissionRegistry) Register(name string, v admission.Admission) error { diff --git a/registry/auther.go b/registry/auther.go index ecc2d36..826104d 100644 --- a/registry/auther.go +++ b/registry/auther.go @@ -5,7 +5,7 @@ import ( ) type autherRegistry struct { - registry + registry[auth.Authenticator] } func (r *autherRegistry) Register(name string, v auth.Authenticator) error { diff --git a/registry/bypass.go b/registry/bypass.go index 8a77c67..5699e44 100644 --- a/registry/bypass.go +++ b/registry/bypass.go @@ -5,7 +5,7 @@ import ( ) type bypassRegistry struct { - registry + registry[bypass.Bypass] } func (r *bypassRegistry) Register(name string, v bypass.Bypass) error { diff --git a/registry/chain.go b/registry/chain.go index ac699b7..b1b27aa 100644 --- a/registry/chain.go +++ b/registry/chain.go @@ -9,7 +9,7 @@ import ( ) type chainRegistry struct { - registry + registry[chain.Chainer] } func (r *chainRegistry) Register(name string, v chain.Chainer) error { diff --git a/registry/connector.go b/registry/connector.go index 955b49b..4d0555f 100644 --- a/registry/connector.go +++ b/registry/connector.go @@ -8,7 +8,7 @@ import ( type NewConnector func(opts ...connector.Option) connector.Connector type connectorRegistry struct { - registry + registry[NewConnector] } func (r *connectorRegistry) Register(name string, v NewConnector) error { @@ -17,10 +17,3 @@ func (r *connectorRegistry) Register(name string, v NewConnector) error { } return nil } - -func (r *connectorRegistry) Get(name string) NewConnector { - if v := r.registry.Get(name); v != nil { - return v.(NewConnector) - } - return nil -} diff --git a/registry/dialer.go b/registry/dialer.go index 2db3b5a..8d5b6f0 100644 --- a/registry/dialer.go +++ b/registry/dialer.go @@ -8,7 +8,7 @@ import ( type NewDialer func(opts ...dialer.Option) dialer.Dialer type dialerRegistry struct { - registry + registry[NewDialer] } func (r *dialerRegistry) Register(name string, v NewDialer) error { @@ -17,10 +17,3 @@ func (r *dialerRegistry) Register(name string, v NewDialer) error { } return nil } - -func (r *dialerRegistry) Get(name string) NewDialer { - if v := r.registry.Get(name); v != nil { - return v.(NewDialer) - } - return nil -} diff --git a/registry/handler.go b/registry/handler.go index c063206..23ddd38 100644 --- a/registry/handler.go +++ b/registry/handler.go @@ -8,7 +8,7 @@ import ( type NewHandler func(opts ...handler.Option) handler.Handler type handlerRegistry struct { - registry + registry[NewHandler] } func (r *handlerRegistry) Register(name string, v NewHandler) error { @@ -17,10 +17,3 @@ func (r *handlerRegistry) Register(name string, v NewHandler) error { } return nil } - -func (r *handlerRegistry) Get(name string) NewHandler { - if v := r.registry.Get(name); v != nil { - return v.(NewHandler) - } - return nil -} diff --git a/registry/hop.go b/registry/hop.go index fdf2c24..52c3ce1 100644 --- a/registry/hop.go +++ b/registry/hop.go @@ -7,7 +7,7 @@ import ( ) type hopRegistry struct { - registry + registry[chain.Hop] } func (r *hopRegistry) Register(name string, v chain.Hop) error { diff --git a/registry/hosts.go b/registry/hosts.go index 16dacad..ab71310 100644 --- a/registry/hosts.go +++ b/registry/hosts.go @@ -7,7 +7,7 @@ import ( ) type hostsRegistry struct { - registry + registry[hosts.HostMapper] } func (r *hostsRegistry) Register(name string, v hosts.HostMapper) error { diff --git a/registry/limiter.go b/registry/limiter.go index 8f38727..218de80 100644 --- a/registry/limiter.go +++ b/registry/limiter.go @@ -7,7 +7,7 @@ import ( ) type trafficLimiterRegistry struct { - registry + registry[traffic.TrafficLimiter] } func (r *trafficLimiterRegistry) Register(name string, v traffic.TrafficLimiter) error { @@ -50,7 +50,7 @@ func (w *trafficLimiterWrapper) Out(key string) traffic.Limiter { } type connLimiterRegistry struct { - registry + registry[conn.ConnLimiter] } func (r *connLimiterRegistry) Register(name string, v conn.ConnLimiter) error { @@ -85,7 +85,7 @@ func (w *connLimiterWrapper) Limiter(key string) conn.Limiter { } type rateLimiterRegistry struct { - registry + registry[rate.RateLimiter] } func (r *rateLimiterRegistry) Register(name string, v rate.RateLimiter) error { diff --git a/registry/listener.go b/registry/listener.go index 8d55ce3..4867c46 100644 --- a/registry/listener.go +++ b/registry/listener.go @@ -8,7 +8,7 @@ import ( type NewListener func(opts ...listener.Option) listener.Listener type listenerRegistry struct { - registry + registry[NewListener] } func (r *listenerRegistry) Register(name string, v NewListener) error { @@ -17,10 +17,3 @@ func (r *listenerRegistry) Register(name string, v NewListener) error { } return nil } - -func (r *listenerRegistry) Get(name string) NewListener { - if v := r.registry.Get(name); v != nil { - return v.(NewListener) - } - return nil -} diff --git a/registry/recorder.go b/registry/recorder.go index 56ab418..0871255 100644 --- a/registry/recorder.go +++ b/registry/recorder.go @@ -7,7 +7,7 @@ import ( ) type recorderRegistry struct { - registry + registry[recorder.Recorder] } func (r *recorderRegistry) Register(name string, v recorder.Recorder) error { diff --git a/registry/registry.go b/registry/registry.go index 0ab9ae3..206f45d 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -23,24 +23,24 @@ var ( ) var ( - listenerReg Registry[NewListener] = &listenerRegistry{} - handlerReg Registry[NewHandler] = &handlerRegistry{} - dialerReg Registry[NewDialer] = &dialerRegistry{} - connectorReg Registry[NewConnector] = &connectorRegistry{} + listenerReg Registry[NewListener] = new(listenerRegistry) + handlerReg Registry[NewHandler] = new(handlerRegistry) + dialerReg Registry[NewDialer] = new(dialerRegistry) + connectorReg Registry[NewConnector] = new(connectorRegistry) - serviceReg Registry[service.Service] = &serviceRegistry{} - chainReg Registry[chain.Chainer] = &chainRegistry{} - hopReg Registry[chain.Hop] = &hopRegistry{} - autherReg Registry[auth.Authenticator] = &autherRegistry{} - admissionReg Registry[admission.Admission] = &admissionRegistry{} - bypassReg Registry[bypass.Bypass] = &bypassRegistry{} - resolverReg Registry[resolver.Resolver] = &resolverRegistry{} - hostsReg Registry[hosts.HostMapper] = &hostsRegistry{} - recorderReg Registry[recorder.Recorder] = &recorderRegistry{} + serviceReg Registry[service.Service] = new(serviceRegistry) + chainReg Registry[chain.Chainer] = new(chainRegistry) + hopReg Registry[chain.Hop] = new(hopRegistry) + autherReg Registry[auth.Authenticator] = new(autherRegistry) + admissionReg Registry[admission.Admission] = new(admissionRegistry) + bypassReg Registry[bypass.Bypass] = new(bypassRegistry) + resolverReg Registry[resolver.Resolver] = new(resolverRegistry) + hostsReg Registry[hosts.HostMapper] = new(hostsRegistry) + recorderReg Registry[recorder.Recorder] = new(recorderRegistry) - trafficLimiterReg Registry[traffic.TrafficLimiter] = &trafficLimiterRegistry{} - connLimiterReg Registry[conn.ConnLimiter] = &connLimiterRegistry{} - rateLimiterReg Registry[rate.RateLimiter] = &rateLimiterRegistry{} + trafficLimiterReg Registry[traffic.TrafficLimiter] = new(trafficLimiterRegistry) + connLimiterReg Registry[conn.ConnLimiter] = new(connLimiterRegistry) + rateLimiterReg Registry[rate.RateLimiter] = new(rateLimiterRegistry) ) type Registry[T any] interface { @@ -48,14 +48,15 @@ type Registry[T any] interface { Unregister(name string) IsRegistered(name string) bool Get(name string) T + GetAll() map[string]T } -type registry struct { +type registry[T any] struct { m sync.Map } -func (r *registry) Register(name string, v any) error { - if name == "" || v == nil { +func (r *registry[T]) Register(name string, v T) error { + if name == "" { return nil } if _, loaded := r.m.LoadOrStore(name, v); loaded { @@ -65,7 +66,7 @@ func (r *registry) Register(name string, v any) error { return nil } -func (r *registry) Unregister(name string) { +func (r *registry[T]) Unregister(name string) { if v, ok := r.m.Load(name); ok { if closer, ok := v.(io.Closer); ok { closer.Close() @@ -74,17 +75,29 @@ func (r *registry) Unregister(name string) { } } -func (r *registry) IsRegistered(name string) bool { +func (r *registry[T]) IsRegistered(name string) bool { _, ok := r.m.Load(name) return ok } -func (r *registry) Get(name string) any { +func (r *registry[T]) Get(name string) (t T) { if name == "" { - return nil + return } v, _ := r.m.Load(name) - return v + t, _ = v.(T) + return +} + +func (r *registry[T]) GetAll() (m map[string]T) { + m = make(map[string]T) + r.m.Range(func(key, value any) bool { + k, _ := key.(string) + v, _ := value.(T) + m[k] = v + return true + }) + return } func ListenerRegistry() Registry[NewListener] { diff --git a/registry/resolver.go b/registry/resolver.go index bd950fa..1de77d9 100644 --- a/registry/resolver.go +++ b/registry/resolver.go @@ -8,7 +8,7 @@ import ( ) type resolverRegistry struct { - registry + registry[resolver.Resolver] } func (r *resolverRegistry) Register(name string, v resolver.Resolver) error { diff --git a/registry/service.go b/registry/service.go index 97bc25a..ab47d86 100644 --- a/registry/service.go +++ b/registry/service.go @@ -5,16 +5,5 @@ import ( ) type serviceRegistry struct { - registry -} - -func (r *serviceRegistry) Register(name string, v service.Service) error { - return r.registry.Register(name, v) -} - -func (r *serviceRegistry) Get(name string) service.Service { - if v := r.registry.Get(name); v != nil { - return v.(service.Service) - } - return nil + registry[service.Service] } diff --git a/service/service.go b/service/service.go index 477dd65..70d5098 100644 --- a/service/service.go +++ b/service/service.go @@ -3,6 +3,8 @@ package service import ( "context" "net" + "os/exec" + "strings" "time" "github.com/go-gost/core/admission" @@ -20,6 +22,10 @@ import ( type options struct { admission admission.Admission recorders []recorder.RecorderObject + preUp []string + postUp []string + preDown []string + postDown []string logger logger.Logger } @@ -37,6 +43,30 @@ func RecordersOption(recorders ...recorder.RecorderObject) Option { } } +func PreUpOption(cmds []string) Option { + return func(opts *options) { + opts.preUp = cmds + } +} + +func PreDownOption(cmds []string) Option { + return func(opts *options) { + opts.preDown = cmds + } +} + +func PostUpOption(cmds []string) Option { + return func(opts *options) { + opts.postUp = cmds + } +} + +func PostDownOption(cmds []string) Option { + return func(opts *options) { + opts.postDown = cmds + } +} + func LoggerOption(logger logger.Logger) Option { return func(opts *options) { opts.logger = logger @@ -55,12 +85,16 @@ func NewService(name string, ln listener.Listener, h handler.Handler, opts ...Op for _, opt := range opts { opt(&options) } - return &defaultService{ + s := &defaultService{ name: name, listener: ln, handler: h, options: options, } + + s.execCmds("pre-up", s.options.preUp) + + return s } func (s *defaultService) Addr() net.Addr { @@ -68,10 +102,15 @@ func (s *defaultService) Addr() net.Addr { } func (s *defaultService) Close() error { + s.execCmds("pre-down", s.options.preDown) + defer s.execCmds("post-down", s.options.postDown) + return s.listener.Close() } func (s *defaultService) Serve() error { + s.execCmds("post-up", s.options.postUp) + if v := xmetrics.GetGauge( xmetrics.MetricServicesGauge, metrics.Labels{}); v != nil { @@ -155,6 +194,20 @@ func (s *defaultService) Serve() error { } } +func (s *defaultService) execCmds(phase string, cmds []string) { + for _, cmd := range cmds { + cmd := strings.TrimSpace(cmd) + if cmd == "" { + continue + } + s.options.logger.Info(cmd) + + if err := exec.Command("/bin/sh", "-c", cmd).Run(); err != nil { + s.options.logger.Warnf("[%s] %s: %v", phase, cmd, err) + } + } +} + type sidKey struct{} var (