Clash.Meta/rules/common/port.go

68 lines
1.2 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
"strconv"
"github.com/Dreamacro/clash/common/utils"
2019-05-09 21:00:29 +08:00
C "github.com/Dreamacro/clash/constant"
)
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
}
2022-11-11 23:36:06 +08:00
return p.matchPortReal(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
}
2021-11-17 16:03:47 +08:00
func (p *Port) matchPortReal(portRef string) bool {
port, _ := strconv.Atoi(portRef)
return p.portRanges.Check(uint16(port))
2021-11-17 16:03:47 +08:00
}
2022-11-11 23:36:06 +08:00
func NewPort(port string, adapter string, ruleType C.RuleType) (*Port, error) {
portRanges, err := utils.NewIntRanges[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)