diff --git a/AK/URLParser.cpp b/AK/URLParser.cpp index d5a40d933e..4318bf5dc7 100644 --- a/AK/URLParser.cpp +++ b/AK/URLParser.cpp @@ -196,12 +196,16 @@ URL URLParser::parse(Badge, const StringView& raw_input, URL const* base_ur if (raw_input[i] <= 0x20) { ++start_index; has_validation_error = true; + } else { + break; } } - for (size_t i = 0; i < raw_input.length(); ++i) { - if (raw_input[raw_input.length() - 1 - i] <= 0x20) { + for (ssize_t i = raw_input.length() - 1; i >= 0; --i) { + if (raw_input[i] <= 0x20) { --end_index; has_validation_error = true; + } else { + break; } } if (has_validation_error) diff --git a/Tests/AK/TestURL.cpp b/Tests/AK/TestURL.cpp index 3fd1413f1d..9fff681525 100644 --- a/Tests/AK/TestURL.cpp +++ b/Tests/AK/TestURL.cpp @@ -307,3 +307,24 @@ TEST_CASE(complete_url) EXPECT(base_url.complete_url("../index.html#fragment").equals(base_url)); } + +TEST_CASE(leading_whitespace) +{ + URL url { " https://foo.com/" }; + EXPECT(url.is_valid()); + EXPECT_EQ(url.to_string(), "https://foo.com/"); +} + +TEST_CASE(trailing_whitespace) +{ + URL url { "https://foo.com/ " }; + EXPECT(url.is_valid()); + EXPECT_EQ(url.to_string(), "https://foo.com/"); +} + +TEST_CASE(leading_and_trailing_whitespace) +{ + URL url { " https://foo.com/ " }; + EXPECT(url.is_valid()); + EXPECT_EQ(url.to_string(), "https://foo.com/"); +}