in proxy_agent/src/common/hyper_client.rs [419:455]
fn get_path_and_canonicalized_parameters(url: &Uri) -> (String, String) {
let path = url.path().to_string();
let query_pairs = query_pairs(url);
let mut canonicalized_parameters = String::new();
let mut pairs: HashMap<String, (String, String)> = HashMap::new();
if !query_pairs.is_empty() {
for (key, value) in query_pairs {
let key = key.to_lowercase();
pairs.insert(
// add the query parameter value for sorting,
// just in case of duplicate keys by value lexicographically in ascending order.
format!("{}{}", key, value),
(key.to_lowercase(), value.to_string()),
);
}
// Sort the parameters lexicographically by parameter name and value, in ascending order.
let mut first = true;
for key in pairs.keys().sorted() {
if !first {
canonicalized_parameters.push('&');
}
first = false;
let query_pair = pairs[key].clone();
// Join each parameter key value pair with '='
let p = if query_pair.1.is_empty() {
key.to_string()
} else {
format!("{}={}", query_pair.0, query_pair.1)
};
canonicalized_parameters.push_str(&p);
}
}
(path, canonicalized_parameters)
}