Skip to content

Commit a8c9ba9

Browse files
committed
util/request_helper: Fix query_with_params() behavior for duplicate keys
Our search endpoint supports having multiple `ids[]` query parameters defined, but the way we generate our paginations fields only considered the last such query parameter until now. This commit fixes the code to include all query parameters instead.
1 parent 0044c42 commit a8c9ba9

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

src/tests/routes/crates/list.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -673,11 +673,11 @@ async fn multiple_ids() -> anyhow::Result<()> {
673673
}
674674

675675
let response = anon.search(&format!("{query}&per_page=1&page=2")).await;
676-
assert_snapshot!(response.meta.prev_page.unwrap(), @"?ids%5B%5D=unknown&per_page=1&page=1");
677-
assert_snapshot!(response.meta.next_page.unwrap(), @"?ids%5B%5D=unknown&per_page=1&page=3");
676+
assert_snapshot!(response.meta.prev_page.unwrap(), @"?ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown&per_page=1&page=1");
677+
assert_snapshot!(response.meta.next_page.unwrap(), @"?ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown&per_page=1&page=3");
678678

679679
let response = anon.search(&format!("{query}&per_page=1")).await;
680-
assert_snapshot!(response.meta.next_page.unwrap(), @"?ids%5B%5D=unknown&per_page=1&seek=Mg");
680+
assert_snapshot!(response.meta.next_page.unwrap(), @"?ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown&per_page=1&seek=Mg");
681681

682682
Ok(())
683683
}

src/util/request_helpers.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,15 @@ impl<T: RequestPartsExt> RequestUtils for T {
4747
}
4848

4949
fn query_with_params(&self, new_params: IndexMap<String, String>) -> String {
50-
let mut params = self.query();
51-
params.extend(new_params);
50+
let query_bytes = self.uri().query().unwrap_or("").as_bytes();
51+
52+
let mut params = url::form_urlencoded::parse(query_bytes)
53+
.into_owned()
54+
.filter(|(key, _)| !new_params.contains_key(key))
55+
.collect::<Vec<_>>();
56+
57+
params.extend(new_params.into_iter());
58+
5259
let query_string = url::form_urlencoded::Serializer::new(String::new())
5360
.extend_pairs(params)
5461
.finish();

0 commit comments

Comments
 (0)