in src/aws/credential.rs [410:451]
fn canonicalize_headers(header_map: &HeaderMap) -> (String, String) {
let mut headers = BTreeMap::<&str, Vec<&str>>::new();
let mut value_count = 0;
let mut value_bytes = 0;
let mut key_bytes = 0;
for (key, value) in header_map {
let key = key.as_str();
if ["authorization", "content-length", "user-agent"].contains(&key) {
continue;
}
let value = std::str::from_utf8(value.as_bytes()).unwrap();
key_bytes += key.len();
value_bytes += value.len();
value_count += 1;
headers.entry(key).or_default().push(value);
}
let mut signed_headers = String::with_capacity(key_bytes + headers.len());
let mut canonical_headers =
String::with_capacity(key_bytes + value_bytes + headers.len() + value_count);
for (header_idx, (name, values)) in headers.into_iter().enumerate() {
if header_idx != 0 {
signed_headers.push(';');
}
signed_headers.push_str(name);
canonical_headers.push_str(name);
canonical_headers.push(':');
for (value_idx, value) in values.into_iter().enumerate() {
if value_idx != 0 {
canonical_headers.push(',');
}
canonical_headers.push_str(value.trim());
}
canonical_headers.push('\n');
}
(signed_headers, canonical_headers)
}