Skip to main content

wireforge_app/http/
headers.rs

1//! HTTP header parsing.
2
3/// A parsed HTTP header (name, value pair).
4#[derive(Debug, Clone)]
5pub struct Header<'a> {
6    pub name: &'a str,
7    pub value: &'a [u8],
8}
9
10/// Iterator over HTTP headers.
11pub struct HeaderIter<'a> {
12    data: &'a [u8],
13}
14
15impl<'a> HeaderIter<'a> {
16    pub fn new(data: &'a [u8]) -> Self { Self { data } }
17}
18
19impl<'a> Iterator for HeaderIter<'a> {
20    type Item = Header<'a>;
21
22    fn next(&mut self) -> Option<Self::Item> {
23        if self.data.is_empty() || self.data == b"\r\n" || self.data.starts_with(b"\r\n") {
24            return None;
25        }
26        let end = self.data.windows(2).position(|w| w == b"\r\n")?;
27        let line = &self.data[..end];
28        self.data = &self.data[end + 2..];
29
30        let colon = line.iter().position(|&b| b == b':')?;
31        let name = core::str::from_utf8(&line[..colon]).ok()?.trim_end();
32        let value = &line[colon + 1..];
33        let value = if value.first() == Some(&b' ') { &value[1..] } else { value };
34
35        Some(Header { name, value })
36    }
37}