diff --git a/internal/util/common/url.go b/internal/util/common/url.go index 13a71323b..c6cb2e4b8 100644 --- a/internal/util/common/url.go +++ b/internal/util/common/url.go @@ -16,9 +16,12 @@ func EnsureURLScheme(raw string) string { if trimmed == "" { return "" } + // Schemes are case-insensitive (RFC 3986), and phone keyboards often + // capitalize the first letter ("Mailto:", "Tel:"). + lower := strings.ToLower(trimmed) if strings.Contains(trimmed, "://") || - strings.HasPrefix(trimmed, "mailto:") || - strings.HasPrefix(trimmed, "tel:") { + strings.HasPrefix(lower, "mailto:") || + strings.HasPrefix(lower, "tel:") { return trimmed } return "https://" + trimmed diff --git a/internal/util/common/url_test.go b/internal/util/common/url_test.go index 167ff6650..2d182294a 100644 --- a/internal/util/common/url_test.go +++ b/internal/util/common/url_test.go @@ -18,6 +18,8 @@ func TestEnsureURLScheme(t *testing.T) { {"mailto", "mailto:support@example.com", "mailto:support@example.com"}, {"tel", "tel:+1234567890", "tel:+1234567890"}, {"trims whitespace", " t.me/xui_support ", "https://t.me/xui_support"}, + {"capitalized mailto", "Mailto:support@example.com", "Mailto:support@example.com"}, + {"uppercase tel", "TEL:+1234567890", "TEL:+1234567890"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {