srctree

Robin Linden parent 796c2d59 25acf962
uri: Support completing fragments

E.g. base=example.com, url=#test => example.com#test
uri/uri.cpp added: 23, removed: 2, total 21
@@ -107,6 +107,15 @@ std::optional<Uri> parse_uri(std::string uristr) {
} else if (!uri.authority.host.empty() && uri.uri.starts_with("//")) {
// Scheme-relative.
completed = parse_uri(fmt::format("{}:{}", base.scheme, uri.uri));
} else if (uri.uri.starts_with('#')) {
// Fragment-only.
// Strip the old fragment if needed
if (!base.fragment.empty()) {
auto start_of_fragment = base.uri.find('#');
completed = parse_uri(fmt::format("{}{}", base.uri.substr(0, start_of_fragment), uri.uri));
} else {
completed = parse_uri(fmt::format("{}{}", base.uri, uri.uri));
}
} else {
// No completion needed.
return true;
 
uri/uri_test.cpp added: 23, removed: 2, total 21
@@ -207,5 +207,17 @@ int main() {
a.expect_eq(completed, uri::Uri::parse("hax://example.com/hello/goodbye").value());
});
 
s.add_test("fragment completion", [](etest::IActions &a) {
auto const base = uri::Uri::parse("hax://example.com").value();
auto const completed = uri::Uri::parse("#test", base).value();
a.expect_eq(completed, uri::Uri::parse("hax://example.com#test").value());
});
 
s.add_test("fragment completion, existing fragment", [](etest::IActions &a) {
auto const base = uri::Uri::parse("hax://example.com#foo").value();
auto const completed = uri::Uri::parse("#bar", base).value();
a.expect_eq(completed, uri::Uri::parse("hax://example.com#bar").value());
});
 
return s.run();
}