Skip to content

Commit 917c7d5

Browse files
committed
fix(ic-http-certification): fix handling of uncertified query parameters
1 parent dd7d8d6 commit 917c7d5

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

dfx.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"dfx": "0.23.0",
2+
"dfx": "0.24.3",
33
"output_env_file": ".env",
44
"version": 1,
55
"networks": {

packages/ic-http-certification/src/hash/request_hash.rs

+23-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn request_hash<'a>(
1818

1919
let filtered_query = request
2020
.get_query()?
21-
.map(|query| get_filtered_query(&query, request_certification));
21+
.and_then(|query| get_filtered_query(&query, request_certification));
2222
if let Some(query_hash) = filtered_query {
2323
filtered_headers.push((":ic-cert-query".into(), Value::String(query_hash)))
2424
}
@@ -59,7 +59,10 @@ fn get_filtered_headers(
5959
.collect()
6060
}
6161

62-
fn get_filtered_query(query: &str, request_certification: &DefaultRequestCertification) -> String {
62+
fn get_filtered_query(
63+
query: &str,
64+
request_certification: &DefaultRequestCertification,
65+
) -> Option<String> {
6366
let filtered_query_string = query
6467
.split('&')
6568
.filter(|query_fragment| {
@@ -77,10 +80,12 @@ fn get_filtered_query(query: &str, request_certification: &DefaultRequestCertifi
7780
})
7881
.unwrap_or(false)
7982
})
80-
.collect::<Vec<&str>>()
81-
.join("&");
83+
.collect::<Vec<_>>();
84+
if filtered_query_string.is_empty() {
85+
return None;
86+
}
8287

83-
filtered_query_string
88+
Some(filtered_query_string.join("&"))
8489
}
8590

8691
#[cfg(test)]
@@ -100,6 +105,19 @@ mod tests {
100105
assert_eq!(result, expected_hash.as_slice());
101106
}
102107

108+
#[test]
109+
fn request_hash_with_uncertified_query() {
110+
let request_certification = DefaultRequestCertification::new(vec!["host"], vec![]);
111+
let request = create_request("https://ic0.app?q=search");
112+
let expected_hash =
113+
hex::decode("10796453466efb3e333891136b8a5931269f77e40ead9d437fcee94a02fa833c")
114+
.unwrap();
115+
116+
let result = request_hash(&request, &request_certification).unwrap();
117+
118+
assert_eq!(result, expected_hash.as_slice());
119+
}
120+
103121
#[test]
104122
fn request_hash_with_query() {
105123
let request_certification =

0 commit comments

Comments
 (0)