mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-03-07 06:49:55 +00:00
feat: support mieru traffic pattern configuration (#2585)
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
mieruserver "github.com/enfein/mieru/v3/apis/server"
|
||||
mierutp "github.com/enfein/mieru/v3/apis/trafficpattern"
|
||||
mierupb "github.com/enfein/mieru/v3/pkg/appctl/appctlpb"
|
||||
)
|
||||
|
||||
@@ -26,8 +27,9 @@ type Mieru struct {
|
||||
|
||||
type MieruOption struct {
|
||||
BaseOption
|
||||
Transport string `inbound:"transport"`
|
||||
Users map[string]string `inbound:"users"`
|
||||
Transport string `inbound:"transport"`
|
||||
Users map[string]string `inbound:"users"`
|
||||
TrafficPattern string `inbound:"traffic-pattern"`
|
||||
}
|
||||
|
||||
type mieruListenerFactory struct{}
|
||||
@@ -154,10 +156,13 @@ func buildMieruServerConfig(option *MieruOption, ports utils.IntRanges[uint16])
|
||||
Password: proto.String(password),
|
||||
})
|
||||
}
|
||||
var trafficPattern *mierupb.TrafficPattern
|
||||
trafficPattern, _ = mierutp.Decode(option.TrafficPattern)
|
||||
return &mieruserver.ServerConfig{
|
||||
Config: &mierupb.ServerConfig{
|
||||
PortBindings: portBindings,
|
||||
Users: users,
|
||||
PortBindings: portBindings,
|
||||
Users: users,
|
||||
TrafficPattern: trafficPattern,
|
||||
},
|
||||
StreamListenerFactory: mieruListenerFactory{},
|
||||
PacketListenerFactory: mieruListenerFactory{},
|
||||
@@ -179,5 +184,14 @@ func validateMieruOption(option *MieruOption) error {
|
||||
return fmt.Errorf("password is empty")
|
||||
}
|
||||
}
|
||||
if option.TrafficPattern != "" {
|
||||
trafficPattern, err := mierutp.Decode(option.TrafficPattern)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to decode traffic pattern %q: %w", option.TrafficPattern, err)
|
||||
}
|
||||
if err := mierutp.Validate(trafficPattern); err != nil {
|
||||
return fmt.Errorf("invalid traffic pattern %q: %w", option.TrafficPattern, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -61,6 +61,20 @@ func TestNewMieru(t *testing.T) {
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid traffic pattern",
|
||||
args: args{
|
||||
option: &inbound.MieruOption{
|
||||
BaseOption: inbound.BaseOption{
|
||||
Port: "8080",
|
||||
},
|
||||
Transport: "TCP",
|
||||
Users: map[string]string{"user": "pass"},
|
||||
TrafficPattern: "GgQIARAK",
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "invalid - no port",
|
||||
args: args{
|
||||
@@ -135,6 +149,20 @@ func TestNewMieru(t *testing.T) {
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid traffic pattern",
|
||||
args: args{
|
||||
option: &inbound.MieruOption{
|
||||
BaseOption: inbound.BaseOption{
|
||||
Port: "8080",
|
||||
},
|
||||
Transport: "TCP",
|
||||
Users: map[string]string{"user": "pass"},
|
||||
TrafficPattern: "1212ababXYYX",
|
||||
},
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user