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