sark_core/http/response/direct/
head.rs1use super::headers::{DEFAULT_HEADER_CAPACITY, HeadersInner};
2
3#[derive(Clone, Debug)]
4pub struct HeadInner<'req, const N: usize = DEFAULT_HEADER_CAPACITY> {
5 static_headers: &'static [u8],
6 headers: HeadersInner<'req, N>,
7}
8
9impl<'req, const N: usize> HeadInner<'req, N> {
10 pub fn new(static_headers: &'static [u8], headers: HeadersInner<'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) -> &HeadersInner<'req, N> {
22 &self.headers
23 }
24
25 pub(super) fn headers_mut(&mut self) -> &mut HeadersInner<'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 fn write_into(&self, out: &mut Vec<u8>) {
34 self.write_into_buffer(out);
35 }
36
37 pub(crate) fn write_into_owned(&self, out: &mut o3::buffer::Owned) {
38 self.write_into_buffer(out);
39 }
40
41 fn write_into_buffer(&self, out: &mut impl super::WireBuffer) {
42 out.extend_from_slice(self.static_headers);
43 self.headers.write_into_buffer(out);
44 }
45
46 pub fn write_slice(&self, out: &mut [u8]) -> Option<usize> {
47 let total = self.wire_len();
48 if out.len() < total {
49 return None;
50 }
51 let n = self.static_headers.len();
52 out[..n].copy_from_slice(self.static_headers);
53 let m = self.headers.write(&mut out[n..]);
54 Some(n + m)
55 }
56}
57
58impl<const N: usize> crate::http::response::wire_emit::HeaderSection for HeadInner<'_, N> {
59 fn header_len(&self) -> usize {
60 Self::wire_len(self)
61 }
62 fn write_headers(&self, out: &mut [u8], off: &mut usize) {
63 let written = self
64 .write_slice(&mut out[*off..])
65 .expect("HeadWrite invariant: head buffer reserved via wire_len");
66 *off += written;
67 }
68}