hyperium / http

Rust HTTP types
Apache License 2.0
1.15k stars 285 forks source link

HeaderMap::from_iter panics when size is known #604

Open jongiddy opened 1 year ago

jongiddy commented 1 year ago

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<_>>());
}