diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 107b621b4..5f86777cc 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -18,7 +18,6 @@ import ( "github.com/metacubex/mihomo/component/resource" C "github.com/metacubex/mihomo/constant" types "github.com/metacubex/mihomo/constant/provider" - "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/tunnel/statistic" "github.com/dlclark/regexp2" @@ -149,10 +148,7 @@ func (pp *proxySetProvider) getSubscriptionInfo() { return } } - pp.subscriptionInfo, err = NewSubscriptionInfo(userInfoStr) - if err != nil { - log.Warnln("[Provider] get subscription-userinfo: %e", err) - } + pp.subscriptionInfo = NewSubscriptionInfo(userInfoStr) }() } diff --git a/adapter/provider/subscription_info.go b/adapter/provider/subscription_info.go index 3a9e2d72c..b72c7b616 100644 --- a/adapter/provider/subscription_info.go +++ b/adapter/provider/subscription_info.go @@ -1,8 +1,11 @@ package provider import ( + "fmt" "strconv" "strings" + + "github.com/metacubex/mihomo/log" ) type SubscriptionInfo struct { @@ -12,28 +15,46 @@ type SubscriptionInfo struct { Expire int64 } -func NewSubscriptionInfo(userinfo string) (si *SubscriptionInfo, err error) { +func NewSubscriptionInfo(userinfo string) (si *SubscriptionInfo) { userinfo = strings.ToLower(userinfo) userinfo = strings.ReplaceAll(userinfo, " ", "") si = new(SubscriptionInfo) + for _, field := range strings.Split(userinfo, ";") { - switch name, value, _ := strings.Cut(field, "="); name { + name, value, ok := strings.Cut(field, "=") + if !ok { + continue + } + + intValue, err := parseValue(value) + if err != nil { + log.Warnln("[Provider] get subscription-userinfo: %e", err) + continue + } + + switch name { case "upload": - si.Upload, err = strconv.ParseInt(value, 10, 64) + si.Upload = intValue case "download": - si.Download, err = strconv.ParseInt(value, 10, 64) + si.Download = intValue case "total": - si.Total, err = strconv.ParseInt(value, 10, 64) + si.Total = intValue case "expire": - if value == "" { - si.Expire = 0 - } else { - si.Expire, err = strconv.ParseInt(value, 10, 64) - } - } - if err != nil { - return + si.Expire = intValue } } - return + + return si +} + +func parseValue(value string) (int64, error) { + if intValue, err := strconv.ParseInt(value, 10, 64); err == nil { + return intValue, nil + } + + if floatValue, err := strconv.ParseFloat(value, 64); err == nil { + return int64(floatValue), nil + } + + return 0, fmt.Errorf("failed to parse value '%s'", value) }