| |
| package urlutil |
|
|
| import ( |
| "fmt" |
| "net/url" |
| "strings" |
| ) |
|
|
| |
| func Normalize(rawURL string) string { |
| if strings.HasPrefix(rawURL, "http://") || strings.HasPrefix(rawURL, "https://") { |
| return rawURL |
| } |
| return "https://" + rawURL |
| } |
|
|
| |
| |
| func Sanitize(rawURL string) (string, error) { |
| if rawURL == "" { |
| return "", fmt.Errorf("empty URL") |
| } |
|
|
| |
| if strings.Contains(rawURL, "://") || |
| strings.HasPrefix(rawURL, "javascript:") || |
| strings.HasPrefix(rawURL, "vbscript:") || |
| strings.HasPrefix(rawURL, "about:") || |
| strings.HasPrefix(rawURL, "data:") { |
| return rawURL, nil |
| } |
|
|
| |
| normalized := Normalize(rawURL) |
|
|
| parsed, err := url.Parse(normalized) |
| if err != nil { |
| return "", fmt.Errorf("invalid URL: %w", err) |
| } |
|
|
| if parsed.Host == "" { |
| return "", fmt.Errorf("missing host in URL") |
| } |
|
|
| return parsed.String(), nil |
| } |
|
|
| |
| func IsValid(rawURL string) bool { |
| _, err := Sanitize(rawURL) |
| return err == nil |
| } |
|
|
| |
| func ExtractHost(rawURL string) string { |
| |
| if !strings.Contains(rawURL, "://") { |
| rawURL = "https://" + rawURL |
| } |
|
|
| parsed, err := url.Parse(rawURL) |
| if err != nil { |
| return "" |
| } |
|
|
| host := parsed.Hostname() |
| return strings.ToLower(host) |
| } |
|
|