Skip to main content

xitca_http/h1/proto/
header.rs

1use core::mem::MaybeUninit;
2
3use httparse::Header;
4use xitca_unsafe_collection::uninit::PartialInit;
5
6use crate::http::header::HeaderValue;
7
8use super::error::ProtoError;
9
10#[derive(Clone, Copy)]
11pub struct HeaderIndex {
12    pub name: (usize, usize),
13    pub value: (usize, usize),
14}
15
16impl HeaderIndex {
17    /// Record indices of pointer offset of give &[Header<'_>] slice from the &[u8] it parse from.
18    pub fn record<'i>(indices: &'i mut [MaybeUninit<Self>], buf: &[u8], headers: &[Header<'_>]) -> &'i [Self] {
19        let head = buf.as_ptr() as usize;
20        indices.init_from(headers.iter()).into_init_with(|header| {
21            let name_start = header.name.as_ptr() as usize - head;
22            let value_start = header.value.as_ptr() as usize - head;
23            let name_end = name_start + header.name.len();
24            let value_end = value_start + header.value.len();
25            Self {
26                name: (name_start, name_end),
27                value: (value_start, value_end),
28            }
29        })
30    }
31}
32
33pub(super) fn parse_content_length(val: &HeaderValue) -> Result<u64, ProtoError> {
34    val.to_str()
35        .ok()
36        .and_then(|v| v.parse().ok())
37        .ok_or(ProtoError::HeaderValue)
38}