Files
sub2api-cn-relay-manager/internal/batch/provider_id.go
2026-05-22 14:33:29 +08:00

64 lines
1.3 KiB
Go

package batch
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"net/url"
"path"
"strings"
)
func NormalizeProviderID(baseURL string) string {
parsedURL, err := url.Parse(strings.TrimSpace(baseURL))
if err != nil {
return ""
}
if parsedURL.Scheme == "" || parsedURL.Host == "" {
return ""
}
normalizedHost := normalizeProviderHost(parsedURL.Hostname())
normalizedPath := path.Clean(strings.TrimSpace(parsedURL.EscapedPath()))
if normalizedPath == "." {
normalizedPath = ""
}
normalizedURL := parsedURL.Scheme + "://" + strings.ToLower(parsedURL.Hostname()) + normalizedPath
digest := sha256.Sum256([]byte(normalizedURL))
hash := hex.EncodeToString(digest[:])
if len(hash) > 8 {
hash = hash[len(hash)-8:]
}
if normalizedHost == "" {
normalizedHost = "provider"
}
return fmt.Sprintf("%s-%s", normalizedHost, hash)
}
func normalizeProviderHost(host string) string {
host = strings.TrimSpace(strings.ToLower(host))
if host == "" {
return ""
}
parts := strings.Split(host, ".")
filtered := make([]string, 0, len(parts))
for _, part := range parts {
part = strings.TrimSpace(part)
if part == "" {
continue
}
filtered = append(filtered, part)
}
if len(filtered) > 1 {
filtered = filtered[:len(filtered)-1]
}
if len(filtered) == 0 {
return strings.ReplaceAll(host, ".", "-")
}
return strings.Join(filtered, "-")
}