Skip to content

Commit

Permalink
fix edge case where hash and search is empty (#878)
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig authored Feb 15, 2025
1 parent 8d3068e commit 3037390
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 11 deletions.
8 changes: 4 additions & 4 deletions include/ada/url_pattern-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -346,8 +346,8 @@ result<std::optional<url_pattern_result>> url_pattern<regex_provider>::match(
// is removed. Similar work was done on workerd:
// https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2232
if (url->has_search()) {
ADA_ASSERT_TRUE(url->get_search().starts_with("?"));
search = url->get_search().substr(1);
auto view = url->get_search();
search = view.starts_with("?") ? url->get_search().substr(1) : view;
} else {
search = "";
}
Expand All @@ -356,8 +356,8 @@ result<std::optional<url_pattern_result>> url_pattern<regex_provider>::match(
// removed. Similar work was done on workerd:
// https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2242
if (url->has_hash()) {
ADA_ASSERT_TRUE(url->get_hash().starts_with("#"));
hash = url->get_hash().substr(1);
auto view = url->get_hash();
hash = view.starts_with("#") ? url->get_hash().substr(1) : view;
} else {
hash = "";
}
Expand Down
20 changes: 13 additions & 7 deletions tests/wpt_urlpattern_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ using regex_provider = ada::url_pattern_regex::std_regex_provider;
constexpr std::string_view URL_PATTERN_TEST_DATA =
"wpt/urlpatterntestdata.json";

// Ref: https://github.com/nodejs/node/issues/57043
TEST(wpt_urlpattern_tests, test_std_out_of_range) {
std::string_view base = "http://example.com";
auto u = ada::parse_url_pattern<regex_provider>("/foo", &base);
ASSERT_TRUE(u);
auto match = u->exec("?", nullptr);
ASSERT_TRUE(match);
SUCCEED();
}

TEST(wpt_urlpattern_tests, test_regex_difference) {
// {
// "pattern": [{ "pathname": "/foo/bar" }],
Expand All @@ -25,8 +35,7 @@ TEST(wpt_urlpattern_tests, test_regex_difference) {
// }
auto init = ada::url_pattern_init{};
init.pathname = "/foo/bar";
auto u =
ada::parse_url_pattern<ada::url_pattern_regex::std_regex_provider>(init);
auto u = ada::parse_url_pattern<regex_provider>(init);
ASSERT_TRUE(u);
auto match = u->exec(init, nullptr);
ASSERT_TRUE(match);
Expand Down Expand Up @@ -58,8 +67,7 @@ TEST(wpt_urlpattern_tests, parse_pattern_string_basic_tests) {
TEST(wpt_urlpattern_tests, basic_tests) {
auto init = ada::url_pattern_init{};
init.pathname = "/books";
auto url =
ada::parse_url_pattern<ada::url_pattern_regex::std_regex_provider>(init);
auto url = ada::parse_url_pattern<regex_provider>(init);
ASSERT_TRUE(url);
ASSERT_EQ(url->get_protocol(), "*");
ASSERT_EQ(url->get_hostname(), "*");
Expand Down Expand Up @@ -250,9 +258,7 @@ parse_pattern_field(ondemand::array& patterns) {
return std::tuple(*init_str, base_url, options);
}

tl::expected<ada::url_pattern<ada::url_pattern_regex::std_regex_provider>,
ada::errors>
parse_pattern(
tl::expected<ada::url_pattern<regex_provider>, ada::errors> parse_pattern(
std::variant<std::string, ada::url_pattern_init, bool>& init_variant,
std::optional<std::string>& base_url,
std::optional<ada::url_pattern_options>& options) {
Expand Down

0 comments on commit 3037390

Please sign in to comment.