sark_core/http/response/direct/
head.rs1use 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}