fix(url): keep capitalized mailto: and tel: links as they are (#7052)

EnsureURLScheme matched the mailto: and tel: prefixes case-sensitively, so a support link typed as Mailto: or TEL: (phone keyboards capitalize the first letter) got https:// prepended and opened a broken web page. URL schemes are case-insensitive, and the check now is too.
This commit is contained in:
kevin
2026-11-02 23:22:43 +09:00
committed by GitHub
parent 6d9e836d61
commit 77b56a2178
2 changed files with 7 additions and 2 deletions
+5 -2
View File
@@ -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
+2
View File
@@ -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) {