Skip to main content

sark_core/http/response/direct/
head.rs

1use super::headers::{DEFAULT_HEADER_CAPACITY, Headers};
2
3#[derive(Clone, Debug)]
4pub struct HeadInner<'req, const N: usize = DEFAULT_HEADER_CAPACITY> {
5    static_headers: &'static [u8],
6    headers: Headers<'req, N>,
7}
8
9impl<'req, const N: usize> HeadInner<'req, N> {
10    pub fn new(static_headers: &'static [u8], headers: Headers<'req, N>) -> Self {
11        Self {
12            static_headers,
13            headers,
14        }
15    }
16
17    pub fn static_headers(&self) -> &'static [u8] {
18        self.static_headers
19    }
20
21    pub fn headers(&self) -> &Headers<'req, N> {
22        &self.headers
23    }
24
25    pub(super) fn headers_mut(&mut self) -> &mut Headers<'req, N> {
26        &mut self.headers
27    }
28
29    pub fn wire_len(&self) -> usize {
30        self.static_headers.len() + self.headers.wire_len()
31    }
32
33    pub(crate) fn write_into_owned(&self, out: &mut o3::buffer::Owned) {
34        out.extend_from_slice(self.static_headers);
35        self.headers.write_into_owned(out);
36    }
37
38    pub fn write_slice(&self, out: &mut [u8]) -> Option<usize> {
39        let total = self.wire_len();
40        if out.len() < total {
41            return None;
42        }
43        let n = self.static_headers.len();
44        out[..n].copy_from_slice(self.static_headers);
45        let m = self.headers.write(&mut out[n..]);
46        Some(n + m)
47    }
48}
49
50impl<const N: usize> crate::http::response::wire_emit::HeaderSection for HeadInner<'_, N> {
51    fn header_len(&self) -> usize {
52        Self::wire_len(self)
53    }
54    fn write_headers(&self, out: &mut crate::http::response::wire_emit::WireWriter<'_>) {
55        out.put(self.static_headers);
56        self.headers.write_wire(out);
57    }
58}