Skip to content

Commit 160ee9d

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 160ee9d

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
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: 8 additions & 1 deletion
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();
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+
5157
params.extend(new_params);
58+
5259
let query_string = url::form_urlencoded::Serializer::new(String::new())
5360
.extend_pairs(params)
5461
.finish();

0 commit comments

Comments
 (0)