in src/gcp/credential.rs [849:873]
fn canonicalize_headers(header_map: &HeaderMap) -> (String, String) {
//FIXME add error handling for invalid header values
let mut headers = BTreeMap::<String, Vec<&str>>::new();
for (k, v) in header_map {
headers
.entry(k.as_str().to_lowercase())
.or_default()
.push(std::str::from_utf8(v.as_bytes()).unwrap());
}
let canonicalize_headers = headers
.iter()
.map(|(k, v)| {
format!(
"{}:{}",
k.trim(),
v.iter().map(|v| trim_header_value(v)).join(",")
)
})
.join("\n");
let signed_headers = headers.keys().join(";");
(canonicalize_headers, signed_headers)
}