Skip to main content

neco_server_core/
headers.rs

1/// Minimal header map.
2#[derive(Clone, Debug, Default, PartialEq, Eq)]
3pub struct HeaderMap {
4    entries: Vec<(String, String)>,
5}
6
7impl HeaderMap {
8    /// Creates an empty header map.
9    pub fn new() -> Self {
10        Self::default()
11    }
12
13    /// Inserts or replaces a header by case-insensitive name.
14    pub fn insert(&mut self, name: impl Into<String>, value: impl Into<String>) {
15        let name = name.into();
16        let value = value.into();
17        if let Some((_, existing)) = self
18            .entries
19            .iter_mut()
20            .find(|(existing_name, _)| existing_name.eq_ignore_ascii_case(&name))
21        {
22            *existing = value;
23            return;
24        }
25        self.entries.push((name, value));
26    }
27
28    /// Returns the first value for the given case-insensitive header name.
29    pub fn get(&self, name: &str) -> Option<&str> {
30        self.entries
31            .iter()
32            .find(|(existing_name, _)| existing_name.eq_ignore_ascii_case(name))
33            .map(|(_, value)| value.as_str())
34    }
35
36    /// Returns all header entries.
37    pub fn iter(&self) -> impl Iterator<Item = (&str, &str)> {
38        self.entries
39            .iter()
40            .map(|(name, value)| (name.as_str(), value.as_str()))
41    }
42}