Skip to content

Commit 2764c43

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 2764c43

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

src/tests/routes/crates/list.rs

Lines changed: 7 additions & 7 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
}
@@ -1016,21 +1016,21 @@ async fn pagination_links_included_if_applicable() -> anyhow::Result<()> {
10161016
let page4 = anon.search("letter=p&page=4&per_page=1").await;
10171017

10181018
assert_eq!(
1019-
Some("?letter=p&page=2&per_page=1".to_string()),
1019+
Some("?letter=p&per_page=1&page=2".to_string()),
10201020
page1.meta.next_page
10211021
);
10221022
assert_eq!(None, page1.meta.prev_page);
10231023
assert_eq!(
1024-
Some("?letter=p&page=3&per_page=1".to_string()),
1024+
Some("?letter=p&per_page=1&page=3".to_string()),
10251025
page2.meta.next_page
10261026
);
10271027
assert_eq!(
1028-
Some("?letter=p&page=1&per_page=1".to_string()),
1028+
Some("?letter=p&per_page=1&page=1".to_string()),
10291029
page2.meta.prev_page
10301030
);
10311031
assert_eq!(None, page4.meta.next_page);
10321032
assert_eq!(
1033-
Some("?letter=p&page=2&per_page=1".to_string()),
1033+
Some("?letter=p&per_page=1&page=2".to_string()),
10341034
page3.meta.prev_page
10351035
);
10361036
assert!([page1.meta.total, page2.meta.total, page3.meta.total]

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)