diff --git a/Tests/LibURL/TestURL.cpp b/Tests/LibURL/TestURL.cpp index 89cc014d273..7548aa8ff3d 100644 --- a/Tests/LibURL/TestURL.cpp +++ b/Tests/LibURL/TestURL.cpp @@ -489,3 +489,24 @@ TEST_CASE(username_and_password) EXPECT_EQ(MUST(url.password()), password); } } + +TEST_CASE(ascii_only_url) +{ + { + constexpr auto upper_case_url = "HTTP://EXAMPLE.COM:80/INDEX.HTML#FRAGMENT"sv; + URL::URL url(upper_case_url); + EXPECT(url.is_valid()); + EXPECT_EQ(url.scheme(), "http"); + EXPECT_EQ(MUST(url.serialized_host()), "example.com"sv); + EXPECT_EQ(url.to_byte_string(), "http://example.com/INDEX.HTML#FRAGMENT"); + } + + { + constexpr auto mixed_case_url = "hTtP://eXaMpLe.CoM:80/iNdEx.HtMl#fRaGmEnT"sv; + URL::URL url(mixed_case_url); + EXPECT(url.is_valid()); + EXPECT_EQ(url.scheme(), "http"); + EXPECT_EQ(MUST(url.serialized_host()), "example.com"sv); + EXPECT_EQ(url.to_byte_string(), "http://example.com/iNdEx.HtMl#fRaGmEnT"); + } +} diff --git a/Userland/Libraries/LibURL/Parser.cpp b/Userland/Libraries/LibURL/Parser.cpp index d91843dfb55..55b483a6571 100644 --- a/Userland/Libraries/LibURL/Parser.cpp +++ b/Userland/Libraries/LibURL/Parser.cpp @@ -586,7 +586,9 @@ static ErrorOr domain_to_ascii(StringView domain, bool be_strict) // 3. If result is the empty string, domain-to-ASCII validation error, return failure. if (domain.is_empty()) return Error::from_string_literal("Empty domain"); - return String::from_utf8_without_validation(domain.bytes()); + + auto lowercase_domain = domain.to_lowercase_string(); + return String::from_utf8_without_validation(lowercase_domain.bytes()); } Unicode::IDNA::ToAsciiOptions const options {