1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:17:34 +00:00

AK: Serialize URL hosts with 'concept-host-serializer'

In order to follow spec text to achieve this, we need to change the
underlying representation of a host in AK::URL to deserialized format.
Before this, we were parsing the host and then immediately serializing
it again.

Making that change resulted in a whole bunch of fallout.

After this change, callers can access the serialized data through
this concept-host-serializer. The functional end result of this
change is that IPv6 hosts are now correctly serialized to be
surrounded with '[' and ']'.
This commit is contained in:
Shannon Booth 2023-07-27 21:40:41 +12:00 committed by Andreas Kling
parent 768f070b86
commit 8751be09f9
36 changed files with 175 additions and 143 deletions

View file

@ -22,7 +22,7 @@ TEST_CASE(basic)
URL url("http://www.serenityos.org"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(url.host(), "www.serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
EXPECT_EQ(url.port_or_default(), 80);
EXPECT_EQ(url.serialize_path(), "/");
EXPECT(url.query().is_null());
@ -32,7 +32,7 @@ TEST_CASE(basic)
URL url("https://www.serenityos.org/index.html"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "https");
EXPECT_EQ(url.host(), "www.serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
EXPECT_EQ(url.port_or_default(), 443);
EXPECT_EQ(url.serialize_path(), "/index.html");
EXPECT(url.query().is_null());
@ -42,7 +42,7 @@ TEST_CASE(basic)
URL url("https://www.serenityos.org1/index.html"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "https");
EXPECT_EQ(url.host(), "www.serenityos.org1");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org1");
EXPECT_EQ(url.port_or_default(), 443);
EXPECT_EQ(url.serialize_path(), "/index.html");
EXPECT(url.query().is_null());
@ -52,7 +52,7 @@ TEST_CASE(basic)
URL url("https://localhost:1234/~anon/test/page.html"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "https");
EXPECT_EQ(url.host(), "localhost");
EXPECT_EQ(MUST(url.serialized_host()), "localhost");
EXPECT_EQ(url.port_or_default(), 1234);
EXPECT_EQ(url.serialize_path(), "/~anon/test/page.html");
EXPECT(url.query().is_null());
@ -62,7 +62,7 @@ TEST_CASE(basic)
URL url("http://www.serenityos.org/index.html?#"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(url.host(), "www.serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
EXPECT_EQ(url.port_or_default(), 80);
EXPECT_EQ(url.serialize_path(), "/index.html");
EXPECT_EQ(url.query(), "");
@ -72,7 +72,7 @@ TEST_CASE(basic)
URL url("http://www.serenityos.org/index.html?foo=1&bar=2"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(url.host(), "www.serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
EXPECT_EQ(url.port_or_default(), 80);
EXPECT_EQ(url.serialize_path(), "/index.html");
EXPECT_EQ(url.query(), "foo=1&bar=2");
@ -82,7 +82,7 @@ TEST_CASE(basic)
URL url("http://www.serenityos.org/index.html#fragment"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(url.host(), "www.serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
EXPECT_EQ(url.port_or_default(), 80);
EXPECT_EQ(url.serialize_path(), "/index.html");
EXPECT(url.query().is_null());
@ -92,7 +92,7 @@ TEST_CASE(basic)
URL url("http://www.serenityos.org/index.html?foo=1&bar=2&baz=/?#frag/ment?test#"sv);
EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(url.host(), "www.serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
EXPECT_EQ(url.port_or_default(), 80);
EXPECT_EQ(url.serialize_path(), "/index.html");
EXPECT_EQ(url.query(), "foo=1&bar=2&baz=/?");
@ -128,7 +128,7 @@ TEST_CASE(file_url_with_hostname)
URL url("file://courage/my/file"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.host(), "courage");
EXPECT_EQ(MUST(url.serialized_host()), "courage");
EXPECT_EQ(url.port_or_default(), 0);
EXPECT_EQ(url.serialize_path(), "/my/file");
EXPECT_EQ(url.serialize(), "file://courage/my/file");
@ -141,7 +141,7 @@ TEST_CASE(file_url_with_localhost)
URL url("file://localhost/my/file"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.host(), "");
EXPECT_EQ(MUST(url.serialized_host()), "");
EXPECT_EQ(url.serialize_path(), "/my/file");
EXPECT_EQ(url.serialize(), "file:///my/file");
}
@ -151,7 +151,7 @@ TEST_CASE(file_url_without_hostname)
URL url("file:///my/file"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.host(), "");
EXPECT_EQ(MUST(url.serialized_host()), "");
EXPECT_EQ(url.serialize_path(), "/my/file");
EXPECT_EQ(url.serialize(), "file:///my/file");
}
@ -205,7 +205,7 @@ TEST_CASE(about_url)
URL url("about:blank"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "about");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.serialize_path(), "blank");
EXPECT(url.query().is_null());
EXPECT(url.fragment().is_null());
@ -217,7 +217,7 @@ TEST_CASE(mailto_url)
URL url("mailto:mail@example.com"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "mailto");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.port_or_default(), 0);
EXPECT_EQ(url.path_segment_count(), 1u);
EXPECT_EQ(url.path_segment_at_index(0), "mail@example.com");
@ -231,7 +231,7 @@ TEST_CASE(data_url)
URL url("data:text/html,test"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/html");
EXPECT_EQ(url.data_payload(), "test");
EXPECT(!url.data_payload_is_base64());
@ -243,7 +243,7 @@ TEST_CASE(data_url_default_mime_type)
URL url("data:,test"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/plain");
EXPECT_EQ(url.data_payload(), "test");
EXPECT(!url.data_payload_is_base64());
@ -255,7 +255,7 @@ TEST_CASE(data_url_encoded)
URL url("data:text/html,Hello%20friends%2C%0X%X0"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/html");
EXPECT_EQ(url.data_payload(), "Hello friends,%0X%X0");
EXPECT(!url.data_payload_is_base64());
@ -267,7 +267,7 @@ TEST_CASE(data_url_base64_encoded)
URL url("data:text/html;base64,test"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/html");
EXPECT_EQ(url.data_payload(), "test");
EXPECT(url.data_payload_is_base64());
@ -279,7 +279,7 @@ TEST_CASE(data_url_base64_encoded_default_mime_type)
URL url("data:;base64,test"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/plain");
EXPECT_EQ(url.data_payload(), "test");
EXPECT(url.data_payload_is_base64());
@ -291,7 +291,7 @@ TEST_CASE(data_url_base64_encoded_with_whitespace)
URL url("data: text/html ; bAsE64 , test with whitespace "sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/html");
EXPECT_EQ(url.data_payload(), " test with whitespace ");
EXPECT(url.data_payload_is_base64());
@ -303,7 +303,7 @@ TEST_CASE(data_url_base64_encoded_with_inline_whitespace)
URL url("data:text/javascript;base64,%20ZD%20Qg%0D%0APS%20An%20Zm91cic%0D%0A%207%20"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().is_null());
EXPECT(url.host().has<Empty>());
EXPECT_EQ(url.data_mime_type(), "text/javascript");
EXPECT(url.data_payload_is_base64());
EXPECT_EQ(url.data_payload(), " ZD Qg\r\nPS An Zm91cic\r\n 7 "sv);
@ -371,7 +371,7 @@ TEST_CASE(complete_url)
URL url = base_url.complete_url("test.html"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(url.host(), "serenityos.org");
EXPECT_EQ(MUST(url.serialized_host()), "serenityos.org");
EXPECT_EQ(url.serialize_path(), "/test.html");
EXPECT(url.query().is_null());
EXPECT(url.query().is_null());
@ -445,6 +445,7 @@ TEST_CASE(ipv6_address)
constexpr auto ipv6_url = "http://[::1]/index.html"sv;
URL url(ipv6_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[::1]"sv);
EXPECT_EQ(url, ipv6_url);
}
@ -452,6 +453,7 @@ TEST_CASE(ipv6_address)
constexpr auto ipv6_url = "http://[0:f:0:0:f:f:0:0]/index.html"sv;
URL url(ipv6_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[0:f::f:f:0:0]"sv);
EXPECT_EQ(url, ipv6_url);
}
@ -459,6 +461,7 @@ TEST_CASE(ipv6_address)
constexpr auto ipv6_url = "https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]/index.html"sv;
URL url(ipv6_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[2001:db8:85a3::8a2e:370:7334]"sv);
EXPECT_EQ(url, ipv6_url);
}
@ -475,14 +478,14 @@ TEST_CASE(ipv4_address)
constexpr auto ipv4_url = "http://127.0.0.1/index.html"sv;
URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(url.host(), "127.0.0.1"sv);
EXPECT_EQ(MUST(url.serialized_host()), "127.0.0.1"sv);
}
{
constexpr auto ipv4_url = "http://0x.0x.0"sv;
URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(url.host(), "0.0.0.0"sv);
EXPECT_EQ(MUST(url.serialized_host()), "0.0.0.0"sv);
}
{
@ -495,13 +498,13 @@ TEST_CASE(ipv4_address)
constexpr auto ipv4_url = "http://256"sv;
URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(url.host(), "0.0.1.0"sv);
EXPECT_EQ(MUST(url.serialized_host()), "0.0.1.0"sv);
}
{
constexpr auto ipv4_url = "http://888888888"sv;
URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(url.host(), "52.251.94.56"sv);
EXPECT_EQ(MUST(url.serialized_host()), "52.251.94.56"sv);
}
}