From 0e1bdb07d4e8bc45a0715f8b9a83d70de2b5a093 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sat, 20 Jan 2024 11:00:06 +0800 Subject: [PATCH] chore: rewrite IntRanges constructor --- adapter/outboundgroup/fallback.go | 2 +- adapter/outboundgroup/parser.go | 2 +- adapter/provider/parser.go | 2 +- common/utils/ranges.go | 42 +++++++++++++++++++++++++++---- config/config.go | 4 +-- hub/route/groups.go | 2 +- hub/route/proxies.go | 2 +- rules/common/port.go | 2 +- rules/common/uid.go | 2 +- 9 files changed, 46 insertions(+), 14 deletions(-) diff --git a/adapter/outboundgroup/fallback.go b/adapter/outboundgroup/fallback.go index 9db97cf38..4c8a22474 100644 --- a/adapter/outboundgroup/fallback.go +++ b/adapter/outboundgroup/fallback.go @@ -141,7 +141,7 @@ func (f *Fallback) Set(name string) error { if !p.AliveForTestUrl(f.testUrl) { ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*time.Duration(5000)) defer cancel() - expectedStatus, _ := utils.NewIntRanges[uint16](f.expectedStatus) + expectedStatus, _ := utils.NewUnsignedRanges[uint16](f.expectedStatus) _, _ = p.URLTest(ctx, f.testUrl, expectedStatus) } diff --git a/adapter/outboundgroup/parser.go b/adapter/outboundgroup/parser.go index de20c6ea3..84b7ccd6d 100644 --- a/adapter/outboundgroup/parser.go +++ b/adapter/outboundgroup/parser.go @@ -80,7 +80,7 @@ func ParseProxyGroup(config map[string]any, proxyMap map[string]C.Proxy, provide return nil, fmt.Errorf("%s: %w", groupName, errMissProxy) } - expectedStatus, err := utils.NewIntRanges[uint16](groupOption.ExpectedStatus) + expectedStatus, err := utils.NewUnsignedRanges[uint16](groupOption.ExpectedStatus) if err != nil { return nil, fmt.Errorf("%s: %w", groupName, err) } diff --git a/adapter/provider/parser.go b/adapter/provider/parser.go index c78a9d390..9956dc8c7 100644 --- a/adapter/provider/parser.go +++ b/adapter/provider/parser.go @@ -63,7 +63,7 @@ func ParseProxyProvider(name string, mapping map[string]any) (types.ProxyProvide return nil, err } - expectedStatus, err := utils.NewIntRanges[uint16](schema.HealthCheck.ExpectedStatus) + expectedStatus, err := utils.NewUnsignedRanges[uint16](schema.HealthCheck.ExpectedStatus) if err != nil { return nil, err } diff --git a/common/utils/ranges.go b/common/utils/ranges.go index f36c22ec8..810105ff7 100644 --- a/common/utils/ranges.go +++ b/common/utils/ranges.go @@ -13,7 +13,7 @@ type IntRanges[T constraints.Integer] []Range[T] var errIntRanges = errors.New("intRanges error") -func NewIntRanges[T constraints.Integer](expected string) (IntRanges[T], error) { +func newIntRanges[T constraints.Integer](expected string, parseFn func(string) (T, error)) (IntRanges[T], error) { // example: 200 or 200/302 or 200-400 or 200/204/401-429/501-503 expected = strings.TrimSpace(expected) if len(expected) == 0 || expected == "*" { @@ -25,10 +25,10 @@ func NewIntRanges[T constraints.Integer](expected string) (IntRanges[T], error) return nil, fmt.Errorf("%w, too many ranges to use, maximum support 28 ranges", errIntRanges) } - return NewIntRangesFromList[T](list) + return newIntRangesFromList[T](list, parseFn) } -func NewIntRangesFromList[T constraints.Integer](list []string) (IntRanges[T], error) { +func newIntRangesFromList[T constraints.Integer](list []string, parseFn func(string) (T, error)) (IntRanges[T], error) { var ranges IntRanges[T] for _, s := range list { if s == "" { @@ -41,7 +41,7 @@ func NewIntRangesFromList[T constraints.Integer](list []string) (IntRanges[T], e return nil, errIntRanges } - start, err := strconv.ParseInt(strings.Trim(status[0], "[ ]"), 10, 64) + start, err := parseFn(strings.Trim(status[0], "[ ]")) if err != nil { return nil, errIntRanges } @@ -50,7 +50,7 @@ func NewIntRangesFromList[T constraints.Integer](list []string) (IntRanges[T], e case 1: ranges = append(ranges, NewRange(T(start), T(start))) case 2: - end, err := strconv.ParseUint(strings.Trim(status[1], "[ ]"), 10, 64) + end, err := parseFn(strings.Trim(status[1], "[ ]")) if err != nil { return nil, errIntRanges } @@ -62,6 +62,38 @@ func NewIntRangesFromList[T constraints.Integer](list []string) (IntRanges[T], e return ranges, nil } +func parseUnsigned[T constraints.Unsigned](s string) (T, error) { + if val, err := strconv.ParseUint(s, 10, 64); err == nil { + return T(val), nil + } else { + return 0, err + } +} + +func NewUnsignedRanges[T constraints.Unsigned](expected string) (IntRanges[T], error) { + return newIntRanges(expected, parseUnsigned[T]) +} + +func NewUnsignedRangesFromList[T constraints.Unsigned](list []string) (IntRanges[T], error) { + return newIntRangesFromList(list, parseUnsigned[T]) +} + +func parseSigned[T constraints.Signed](s string) (T, error) { + if val, err := strconv.ParseInt(s, 10, 64); err == nil { + return T(val), nil + } else { + return 0, err + } +} + +func NewSignedRanges[T constraints.Signed](expected string) (IntRanges[T], error) { + return newIntRanges(expected, parseSigned[T]) +} + +func NewSignedRangesFromList[T constraints.Signed](list []string) (IntRanges[T], error) { + return newIntRangesFromList(list, parseSigned[T]) +} + func (ranges IntRanges[T]) Check(status T) bool { if len(ranges) == 0 { return true diff --git a/config/config.go b/config/config.go index bb503b497..dce61f63f 100644 --- a/config/config.go +++ b/config/config.go @@ -1473,7 +1473,7 @@ func parseSniffer(snifferRaw RawSniffer) (*Sniffer, error) { if len(snifferRaw.Sniff) != 0 { for sniffType, sniffConfig := range snifferRaw.Sniff { find := false - ports, err := utils.NewIntRangesFromList[uint16](sniffConfig.Ports) + ports, err := utils.NewUnsignedRangesFromList[uint16](sniffConfig.Ports) if err != nil { return nil, err } @@ -1500,7 +1500,7 @@ func parseSniffer(snifferRaw RawSniffer) (*Sniffer, error) { // Deprecated: Use Sniff instead log.Warnln("Deprecated: Use Sniff instead") } - globalPorts, err := utils.NewIntRangesFromList[uint16](snifferRaw.Ports) + globalPorts, err := utils.NewUnsignedRangesFromList[uint16](snifferRaw.Ports) if err != nil { return nil, err } diff --git a/hub/route/groups.go b/hub/route/groups.go index 18aabf74b..30dec5f0b 100644 --- a/hub/route/groups.go +++ b/hub/route/groups.go @@ -78,7 +78,7 @@ func getGroupDelay(w http.ResponseWriter, r *http.Request) { return } - expectedStatus, err := utils.NewIntRanges[uint16](query.Get("expected")) + expectedStatus, err := utils.NewUnsignedRanges[uint16](query.Get("expected")) if err != nil { render.Status(r, http.StatusBadRequest) render.JSON(w, r, ErrBadRequest) diff --git a/hub/route/proxies.go b/hub/route/proxies.go index 483597493..69c8e4465 100644 --- a/hub/route/proxies.go +++ b/hub/route/proxies.go @@ -113,7 +113,7 @@ func getProxyDelay(w http.ResponseWriter, r *http.Request) { return } - expectedStatus, err := utils.NewIntRanges[uint16](query.Get("expected")) + expectedStatus, err := utils.NewUnsignedRanges[uint16](query.Get("expected")) if err != nil { render.Status(r, http.StatusBadRequest) render.JSON(w, r, ErrBadRequest) diff --git a/rules/common/port.go b/rules/common/port.go index ec76cf30a..d3f6e1b46 100644 --- a/rules/common/port.go +++ b/rules/common/port.go @@ -39,7 +39,7 @@ func (p *Port) Payload() string { } func NewPort(port string, adapter string, ruleType C.RuleType) (*Port, error) { - portRanges, err := utils.NewIntRanges[uint16](port) + portRanges, err := utils.NewUnsignedRanges[uint16](port) if err != nil { return nil, fmt.Errorf("%w, %w", errPayload, err) } diff --git a/rules/common/uid.go b/rules/common/uid.go index de46c4093..c80632b03 100644 --- a/rules/common/uid.go +++ b/rules/common/uid.go @@ -21,7 +21,7 @@ func NewUid(oUid, adapter string) (*Uid, error) { return nil, fmt.Errorf("uid rule not support this platform") } - uidRange, err := utils.NewIntRanges[uint32](oUid) + uidRange, err := utils.NewUnsignedRanges[uint32](oUid) if err != nil { return nil, fmt.Errorf("%w, %w", errPayload, err) }