refractor: create limiter conn

This commit is contained in:
zakuwaki 2023-09-20 19:36:45 +08:00
parent ef6b563d02
commit 630cdb0757
3 changed files with 19 additions and 23 deletions

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"net" "net"
"github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/common/humanize" "github.com/sagernet/sing-box/common/humanize"
"github.com/sagernet/sing-box/log" "github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/option"
@ -86,22 +87,23 @@ func (m *defaultManager) createLimiter(ctx context.Context, option option.Limite
return return
} }
func (m *defaultManager) LoadLimiters(tags []string, user, inbound string) (limiters []*limiter) { func (m *defaultManager) NewConnWithLimiters(ctx context.Context, conn net.Conn, metadata *adapter.InboundContext, rule adapter.Rule) net.Conn {
for _, tag := range tags { var limiters []*limiter
if rule != nil {
for _, tag := range rule.Limiters() {
if v, ok := m.mp[limiterKey{prefixTag, tag}]; ok { if v, ok := m.mp[limiterKey{prefixTag, tag}]; ok {
limiters = append(limiters, v) limiters = append(limiters, v)
} }
} }
if v, ok := m.mp[limiterKey{prefixUser, user}]; ok { }
if metadata != nil {
if v, ok := m.mp[limiterKey{prefixUser, metadata.User}]; ok {
limiters = append(limiters, v) limiters = append(limiters, v)
} }
if v, ok := m.mp[limiterKey{prefixInbound, inbound}]; ok { if v, ok := m.mp[limiterKey{prefixInbound, metadata.Inbound}]; ok {
limiters = append(limiters, v) limiters = append(limiters, v)
} }
return
} }
func (m *defaultManager) NewConnWithLimiters(ctx context.Context, conn net.Conn, limiters []*limiter) net.Conn {
for _, limiter := range limiters { for _, limiter := range limiters {
conn = &connWithLimiter{Conn: conn, limiter: limiter, ctx: ctx} conn = &connWithLimiter{Conn: conn, limiter: limiter, ctx: ctx}
} }

View File

@ -3,9 +3,10 @@ package limiter
import ( import (
"context" "context"
"net" "net"
"github.com/sagernet/sing-box/adapter"
) )
type Manager interface { type Manager interface {
LoadLimiters(tags []string, user, inbound string) []*limiter NewConnWithLimiters(ctx context.Context, conn net.Conn, metadata *adapter.InboundContext, rule adapter.Rule) net.Conn
NewConnWithLimiters(ctx context.Context, conn net.Conn, limiters []*limiter) net.Conn
} }

View File

@ -708,14 +708,7 @@ func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata ad
} }
if r.limiterManager != nil { if r.limiterManager != nil {
var limiterTags []string conn = r.limiterManager.NewConnWithLimiters(ctx, conn, &metadata, matchedRule)
if matchedRule != nil {
limiterTags = matchedRule.Limiters()
}
limiters := r.limiterManager.LoadLimiters(limiterTags, metadata.User, metadata.Inbound)
if len(limiters) > 0 {
conn = r.limiterManager.NewConnWithLimiters(ctx, conn, limiters)
}
} }
if r.clashServer != nil { if r.clashServer != nil {