In this code, HeaderMap::from_iter panics for a set of headers that can fit into a HeaderMap. Most likely the size hint should be capped to 24576 to avoid this panic until too many names are appended.
use http::{HeaderMap, HeaderName, HeaderValue};
fn main() {
// If we add 24576 names here, then we cannot append extra values.
let mut headers = (0..24575)
.map(|i| {
(
HeaderName::from_bytes(format!("H{}", i).as_bytes()).unwrap(),
HeaderValue::from_static("0"),
)
})
.collect::<HeaderMap>();
// Append more values to existing name
let mut i = 1;
while i < 8195 && headers.append(
HeaderName::from_bytes(format!("H{}", 1).as_bytes()).unwrap(),
HeaderValue::from_str(&i.to_string()).unwrap(),
) {
i += 1;
}
assert_eq!(headers.len(), 32769);
// Does not panic
HeaderMap::from_iter(headers.iter().map(|(n, v)| (n.clone(), v.clone())));
// Panics
HeaderMap::from_iter(headers.iter().map(|(n, v)| (n.clone(), v.clone())).collect::<Vec<_>>());
}
In this code,
HeaderMap::from_iter
panics for a set of headers that can fit into aHeaderMap
. Most likely the size hint should be capped to 24576 to avoid this panic until too many names are appended.