fn get_path_and_canonicalized_parameters()

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)
}