Skip to main content

sark_core/http/response/direct/
head.rs

1use o3::buffer::Owned;
2
3use super::headers::HeadersInner;
4
5#[derive(Clone, Debug)]
6pub struct HeadInner<'req> {
7    static_headers: &'static [u8],
8    extra_static: &'static [u8],
9    headers: HeadersInner<'req>,
10}
11
12impl<'req> HeadInner<'req> {
13    pub fn new(static_headers: &'static [u8], headers: HeadersInner<'req>) -> Self {
14        Self {
15            static_headers,
16            extra_static: b"",
17            headers,
18        }
19    }
20
21    pub fn static_headers(&self) -> &'static [u8] {
22        self.static_headers
23    }
24
25    pub fn headers(&self) -> &HeadersInner<'req> {
26        &self.headers
27    }
28
29    pub(super) fn headers_mut(&mut self) -> &mut HeadersInner<'req> {
30        &mut self.headers
31    }
32
33    pub fn set_extra_static(&mut self, extra: &'static [u8]) {
34        self.extra_static = extra;
35    }
36
37    pub fn wire_len(&self) -> usize {
38        self.static_headers.len() + self.extra_static.len() + self.headers.wire_len()
39    }
40
41    pub fn write_into(&self, out: &mut Owned) {
42        out.extend_from_slice(self.static_headers);
43        out.extend_from_slice(self.extra_static);
44        self.headers.write_into(out);
45    }
46
47    pub fn write_slice(&self, out: &mut [u8]) -> Option<usize> {
48        let total = self.wire_len();
49        if out.len() < total {
50            return None;
51        }
52        let n = self.static_headers.len();
53        out[..n].copy_from_slice(self.static_headers);
54        let e = self.extra_static.len();
55        out[n..n + e].copy_from_slice(self.extra_static);
56        let m = self.headers.write(&mut out[n + e..]);
57        Some(n + e + m)
58    }
59}
60
61impl crate::http::response::wire_emit::HeaderSection for HeadInner<'_> {
62    fn header_len(&self) -> usize {
63        Self::wire_len(self)
64    }
65    fn write_headers(&self, out: &mut [u8], off: &mut usize) {
66        let written = self
67            .write_slice(&mut out[*off..])
68            .expect("HeadWrite invariant: head buffer reserved via wire_len");
69        *off += written;
70    }
71}