64 lines
1.3 KiB
Go
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, "-")
|
|
}
|