service: add limiter.scope option

This commit is contained in:
ginuerzh
2025-01-20 23:22:58 +08:00
parent bf36bdc680
commit 379d9a73ad
80 changed files with 374 additions and 685 deletions
+6 -2
View File
@@ -89,8 +89,12 @@ func (h *httpHandler) Init(md md.Metadata) error {
go h.observeStats(ctx)
}
if limiter := h.options.Limiter; limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(limiter, h.md.limiterRefreshInterval, 60*time.Second)
if h.options.Limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(h.options.Limiter,
limiter_util.RefreshIntervalOption(h.md.limiterRefreshInterval),
limiter_util.CleanupIntervalOption(h.md.limiterCleanupInterval),
limiter_util.ScopeOption(limiter.ScopeClient),
)
}
for _, ro := range h.options.Recorders {
+15 -18
View File
@@ -20,16 +20,15 @@ const (
)
type metadata struct {
readTimeout time.Duration
keepalive bool
compression bool
probeResistance *probeResistance
enableUDP bool
header http.Header
hash string
authBasicRealm string
proxyAgent string
limiterRefreshInterval time.Duration
readTimeout time.Duration
keepalive bool
compression bool
probeResistance *probeResistance
enableUDP bool
header http.Header
hash string
authBasicRealm string
proxyAgent string
observerPeriod time.Duration
observerResetTraffic bool
@@ -43,6 +42,9 @@ type metadata struct {
privateKey crypto.PrivateKey
alpn string
mitmBypass bypass.Bypass
limiterRefreshInterval time.Duration
limiterCleanupInterval time.Duration
}
func (h *httpHandler) parseMetadata(md mdata.Metadata) error {
@@ -85,14 +87,6 @@ func (h *httpHandler) parseMetadata(md mdata.Metadata) error {
h.md.observerResetTraffic = mdutil.GetBool(md, "observer.resetTraffic")
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
if h.md.limiterRefreshInterval == 0 {
h.md.limiterRefreshInterval = 30 * time.Second
}
if h.md.limiterRefreshInterval < time.Second {
h.md.limiterRefreshInterval = time.Second
}
h.md.proxyAgent = mdutil.GetString(md, "http.proxyAgent", "proxyAgent")
if h.md.proxyAgent == "" {
h.md.proxyAgent = defaultProxyAgent
@@ -119,6 +113,9 @@ func (h *httpHandler) parseMetadata(md mdata.Metadata) error {
h.md.alpn = mdutil.GetString(md, "mitm.alpn")
h.md.mitmBypass = registry.BypassRegistry().Get(mdutil.GetString(md, "mitm.bypass"))
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
h.md.limiterCleanupInterval = mdutil.GetDuration(md, "limiter.cleanupInterval")
return nil
}
+6 -2
View File
@@ -77,8 +77,12 @@ func (h *http2Handler) Init(md md.Metadata) error {
go h.observeStats(ctx)
}
if limiter := h.options.Limiter; limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(limiter, h.md.limiterRefreshInterval, 60*time.Second)
if h.options.Limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(h.options.Limiter,
limiter_util.RefreshIntervalOption(h.md.limiterRefreshInterval),
limiter_util.CleanupIntervalOption(h.md.limiterCleanupInterval),
limiter_util.ScopeOption(limiter.ScopeClient),
)
}
for _, ro := range h.options.Recorders {
+9 -12
View File
@@ -14,13 +14,15 @@ const (
)
type metadata struct {
probeResistance *probeResistance
header http.Header
hash string
authBasicRealm string
observerPeriod time.Duration
observerResetTraffic bool
probeResistance *probeResistance
header http.Header
hash string
authBasicRealm string
observerPeriod time.Duration
observerResetTraffic bool
limiterRefreshInterval time.Duration
limiterCleanupInterval time.Duration
}
func (h *http2Handler) parseMetadata(md mdata.Metadata) error {
@@ -54,12 +56,7 @@ func (h *http2Handler) parseMetadata(md mdata.Metadata) error {
h.md.observerResetTraffic = mdutil.GetBool(md, "observer.resetTraffic")
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
if h.md.limiterRefreshInterval == 0 {
h.md.limiterRefreshInterval = 30 * time.Second
}
if h.md.limiterRefreshInterval < time.Second {
h.md.limiterRefreshInterval = time.Second
}
h.md.limiterCleanupInterval = mdutil.GetDuration(md, "limiter.cleanupInterval")
return nil
}
+7 -2
View File
@@ -9,6 +9,7 @@ import (
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/limiter"
"github.com/go-gost/core/limiter/traffic"
md "github.com/go-gost/core/metadata"
"github.com/go-gost/core/observer"
@@ -71,8 +72,12 @@ func (h *relayHandler) Init(md md.Metadata) (err error) {
go h.observeStats(ctx)
}
if limiter := h.options.Limiter; limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(limiter, h.md.limiterRefreshInterval, 60*time.Second)
if h.options.Limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(h.options.Limiter,
limiter_util.RefreshIntervalOption(h.md.limiterRefreshInterval),
limiter_util.CleanupIntervalOption(h.md.limiterCleanupInterval),
limiter_util.ScopeOption(limiter.ScopeClient),
)
}
for _, ro := range h.options.Recorders {
+6 -9
View File
@@ -21,7 +21,6 @@ type metadata struct {
noDelay bool
hash string
muxCfg *mux.Config
limiterRefreshInterval time.Duration
observerPeriod time.Duration
observerResetTraffic bool
@@ -35,6 +34,9 @@ type metadata struct {
privateKey crypto.PrivateKey
alpn string
mitmBypass bypass.Bypass
limiterRefreshInterval time.Duration
limiterCleanupInterval time.Duration
}
func (h *relayHandler) parseMetadata(md mdata.Metadata) (err error) {
@@ -74,14 +76,6 @@ func (h *relayHandler) parseMetadata(md mdata.Metadata) (err error) {
h.md.observerResetTraffic = mdutil.GetBool(md, "observer.resetTraffic")
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
if h.md.limiterRefreshInterval == 0 {
h.md.limiterRefreshInterval = 30 * time.Second
}
if h.md.limiterRefreshInterval < time.Second {
h.md.limiterRefreshInterval = time.Second
}
h.md.sniffing = mdutil.GetBool(md, "sniffing")
h.md.sniffingTimeout = mdutil.GetDuration(md, "sniffing.timeout")
h.md.sniffingWebsocket = mdutil.GetBool(md, "sniffing.websocket")
@@ -103,5 +97,8 @@ func (h *relayHandler) parseMetadata(md mdata.Metadata) (err error) {
h.md.alpn = mdutil.GetString(md, "mitm.alpn")
h.md.mitmBypass = registry.BypassRegistry().Get(mdutil.GetString(md, "mitm.bypass"))
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
h.md.limiterCleanupInterval = mdutil.GetDuration(md, "limiter.cleanupInterval")
return
}
+6 -2
View File
@@ -76,8 +76,12 @@ func (h *socks4Handler) Init(md md.Metadata) (err error) {
go h.observeStats(ctx)
}
if limiter := h.options.Limiter; limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(limiter, h.md.limiterRefreshInterval, 60*time.Second)
if h.options.Limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(h.options.Limiter,
limiter_util.RefreshIntervalOption(h.md.limiterRefreshInterval),
limiter_util.CleanupIntervalOption(h.md.limiterCleanupInterval),
limiter_util.ScopeOption(limiter.ScopeClient),
)
}
for _, ro := range h.options.Recorders {
+6 -9
View File
@@ -15,7 +15,6 @@ import (
type metadata struct {
readTimeout time.Duration
hash string
limiterRefreshInterval time.Duration
observerPeriod time.Duration
observerResetTraffic bool
@@ -29,6 +28,9 @@ type metadata struct {
privateKey crypto.PrivateKey
alpn string
mitmBypass bypass.Bypass
limiterRefreshInterval time.Duration
limiterCleanupInterval time.Duration
}
func (h *socks4Handler) parseMetadata(md mdata.Metadata) (err error) {
@@ -49,14 +51,6 @@ func (h *socks4Handler) parseMetadata(md mdata.Metadata) (err error) {
h.md.observerResetTraffic = mdutil.GetBool(md, "observer.resetTraffic")
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
if h.md.limiterRefreshInterval == 0 {
h.md.limiterRefreshInterval = 30 * time.Second
}
if h.md.limiterRefreshInterval < time.Second {
h.md.limiterRefreshInterval = time.Second
}
h.md.sniffing = mdutil.GetBool(md, "sniffing")
h.md.sniffingTimeout = mdutil.GetDuration(md, "sniffing.timeout")
h.md.sniffingWebsocket = mdutil.GetBool(md, "sniffing.websocket")
@@ -78,5 +72,8 @@ func (h *socks4Handler) parseMetadata(md mdata.Metadata) (err error) {
h.md.alpn = mdutil.GetString(md, "mitm.alpn")
h.md.mitmBypass = registry.BypassRegistry().Get(mdutil.GetString(md, "mitm.bypass"))
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
h.md.limiterCleanupInterval = mdutil.GetDuration(md, "limiter.cleanupInterval")
return
}
+7 -2
View File
@@ -7,6 +7,7 @@ import (
"time"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/limiter"
"github.com/go-gost/core/limiter/traffic"
md "github.com/go-gost/core/metadata"
"github.com/go-gost/core/observer"
@@ -76,8 +77,12 @@ func (h *socks5Handler) Init(md md.Metadata) (err error) {
go h.observeStats(ctx)
}
if limiter := h.options.Limiter; limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(limiter, h.md.limiterRefreshInterval, 60*time.Second)
if h.options.Limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(h.options.Limiter,
limiter_util.RefreshIntervalOption(h.md.limiterRefreshInterval),
limiter_util.CleanupIntervalOption(h.md.limiterCleanupInterval),
limiter_util.ScopeOption(limiter.ScopeClient),
)
}
for _, ro := range h.options.Recorders {
+14 -17
View File
@@ -15,15 +15,14 @@ import (
)
type metadata struct {
readTimeout time.Duration
noTLS bool
enableBind bool
enableUDP bool
udpBufferSize int
compatibilityMode bool
hash string
muxCfg *mux.Config
limiterRefreshInterval time.Duration
readTimeout time.Duration
noTLS bool
enableBind bool
enableUDP bool
udpBufferSize int
compatibilityMode bool
hash string
muxCfg *mux.Config
observerPeriod time.Duration
observerResetTraffic bool
@@ -37,6 +36,9 @@ type metadata struct {
privateKey crypto.PrivateKey
alpn string
mitmBypass bypass.Bypass
limiterRefreshInterval time.Duration
limiterCleanupInterval time.Duration
}
func (h *socks5Handler) parseMetadata(md mdata.Metadata) (err error) {
@@ -77,14 +79,6 @@ func (h *socks5Handler) parseMetadata(md mdata.Metadata) (err error) {
}
h.md.observerResetTraffic = mdutil.GetBool(md, "observer.resetTraffic")
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
if h.md.limiterRefreshInterval == 0 {
h.md.limiterRefreshInterval = 30 * time.Second
}
if h.md.limiterRefreshInterval < time.Second {
h.md.limiterRefreshInterval = time.Second
}
h.md.sniffing = mdutil.GetBool(md, "sniffing")
h.md.sniffingTimeout = mdutil.GetDuration(md, "sniffing.timeout")
h.md.sniffingWebsocket = mdutil.GetBool(md, "sniffing.websocket")
@@ -106,5 +100,8 @@ func (h *socks5Handler) parseMetadata(md mdata.Metadata) (err error) {
h.md.alpn = mdutil.GetString(md, "mitm.alpn")
h.md.mitmBypass = registry.BypassRegistry().Get(mdutil.GetString(md, "mitm.bypass"))
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
h.md.limiterCleanupInterval = mdutil.GetDuration(md, "limiter.cleanupInterval")
return nil
}
+7 -2
View File
@@ -10,6 +10,7 @@ import (
"time"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/limiter"
"github.com/go-gost/core/limiter/traffic"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
@@ -121,8 +122,12 @@ func (h *tunnelHandler) Init(md md.Metadata) (err error) {
go h.observeStats(ctx)
}
if limiter := h.options.Limiter; limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(limiter, h.md.limiterRefreshInterval, 60*time.Second)
if h.options.Limiter != nil {
h.limiter = limiter_util.NewCachedTrafficLimiter(h.options.Limiter,
limiter_util.RefreshIntervalOption(h.md.limiterRefreshInterval),
limiter_util.CleanupIntervalOption(h.md.limiterCleanupInterval),
limiter_util.ScopeOption(limiter.ScopeClient),
)
}
return nil
+4 -7
View File
@@ -36,10 +36,12 @@ type metadata struct {
ingress ingress.Ingress
sd sd.SD
muxCfg *mux.Config
limiterRefreshInterval time.Duration
observerPeriod time.Duration
observerResetTraffic bool
limiterRefreshInterval time.Duration
limiterCleanupInterval time.Duration
}
func (h *tunnelHandler) parseMetadata(md mdata.Metadata) (err error) {
@@ -117,12 +119,7 @@ func (h *tunnelHandler) parseMetadata(md mdata.Metadata) (err error) {
h.md.observerResetTraffic = mdutil.GetBool(md, "observer.resetTraffic")
h.md.limiterRefreshInterval = mdutil.GetDuration(md, "limiter.refreshInterval")
if h.md.limiterRefreshInterval == 0 {
h.md.limiterRefreshInterval = 30 * time.Second
}
if h.md.limiterRefreshInterval < time.Second {
h.md.limiterRefreshInterval = time.Second
}
h.md.limiterCleanupInterval = mdutil.GetDuration(md, "limiter.cleanupInterval")
return
}