mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-06-17 20:53:18 +08:00
88 lines
1.8 KiB
Go
88 lines
1.8 KiB
Go
package parser
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"errors"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/bestnite/sub2clash/logger"
|
|
P "github.com/bestnite/sub2clash/model/proxy"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func hasPrefix(proxy string, prefixes []string) bool {
|
|
hasPrefix := false
|
|
for _, prefix := range prefixes {
|
|
if strings.HasPrefix(proxy, prefix) {
|
|
hasPrefix = true
|
|
break
|
|
}
|
|
}
|
|
return hasPrefix
|
|
}
|
|
|
|
func ParsePort(portStr string) (int, error) {
|
|
port, err := strconv.Atoi(portStr)
|
|
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if port < 1 || port > 65535 {
|
|
return 0, errors.New("invaild port range")
|
|
}
|
|
return port, nil
|
|
}
|
|
|
|
func isLikelyBase64(s string) bool {
|
|
if len(s)%4 == 0 && strings.HasSuffix(s, "=") && !strings.Contains(strings.TrimSuffix(s, "="), "=") {
|
|
s = strings.TrimSuffix(s, "=")
|
|
chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
|
for _, c := range s {
|
|
if !strings.ContainsRune(chars, c) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func DecodeBase64(s string) (string, error) {
|
|
s = strings.TrimSpace(s)
|
|
|
|
if strings.Contains(s, "-") || strings.Contains(s, "_") {
|
|
s = strings.Replace(s, "-", "+", -1)
|
|
s = strings.Replace(s, "_", "/", -1)
|
|
}
|
|
if len(s)%4 != 0 {
|
|
s += strings.Repeat("=", 4-len(s)%4)
|
|
}
|
|
decodeStr, err := base64.StdEncoding.DecodeString(s)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(decodeStr), nil
|
|
}
|
|
|
|
func ParseProxies(proxies ...string) []P.Proxy {
|
|
var result []P.Proxy
|
|
for _, proxy := range proxies {
|
|
if proxy != "" {
|
|
var proxyItem P.Proxy
|
|
var err error
|
|
|
|
proxyItem, err = ParseProxyWithRegistry(proxy)
|
|
|
|
if err == nil {
|
|
result = append(result, proxyItem)
|
|
} else {
|
|
logger.Logger.Debug(
|
|
"parse proxy failed", zap.String("proxy", proxy), zap.Error(err),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
return result
|
|
}
|