wireforge_app/http/
headers.rs1#[derive(Debug, Clone)]
5pub struct Header<'a> {
6 pub name: &'a str,
7 pub value: &'a [u8],
8}
9
10pub 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}