Clash.Meta/rules/common/port.go

61 lines
1.1 KiB
Go
Raw Normal View History

package common
2019-05-09 21:00:29 +08:00
import (
2021-11-17 16:03:47 +08:00
"fmt"
2019-05-09 21:00:29 +08:00
2023-11-03 21:01:45 +08:00
"github.com/metacubex/mihomo/common/utils"
C "github.com/metacubex/mihomo/constant"
2019-05-09 21:00:29 +08:00
)
type Port struct {
2022-03-13 01:21:23 +08:00
*Base
adapter string
port string
ruleType C.RuleType
portRanges utils.IntRanges[uint16]
2019-05-09 21:00:29 +08:00
}
func (p *Port) RuleType() C.RuleType {
2022-11-11 23:36:06 +08:00
return p.ruleType
2019-05-09 21:00:29 +08:00
}
func (p *Port) Match(metadata *C.Metadata) (bool, string) {
2022-11-11 23:36:06 +08:00
targetPort := metadata.DstPort
switch p.ruleType {
case C.InPort:
targetPort = metadata.InPort
case C.SrcPort:
targetPort = metadata.SrcPort
2019-05-09 21:00:29 +08:00
}
return p.portRanges.Check(targetPort), p.adapter
2019-05-09 21:00:29 +08:00
}
func (p *Port) Adapter() string {
return p.adapter
}
func (p *Port) Payload() string {
return p.port
}
2022-11-11 23:36:06 +08:00
func NewPort(port string, adapter string, ruleType C.RuleType) (*Port, error) {
2024-01-20 11:00:06 +08:00
portRanges, err := utils.NewUnsignedRanges[uint16](port)
if err != nil {
return nil, fmt.Errorf("%w, %w", errPayload, err)
2021-11-17 16:03:47 +08:00
}
if len(portRanges) == 0 {
return nil, errPayload
2019-05-09 21:00:29 +08:00
}
2021-11-17 16:03:47 +08:00
2019-05-09 21:00:29 +08:00
return &Port{
Base: &Base{},
adapter: adapter,
port: port,
ruleType: ruleType,
portRanges: portRanges,
}, nil
2019-05-09 21:00:29 +08:00
}
2022-03-13 01:21:23 +08:00
var _ C.Rule = (*Port)(nil)