1 // Copyright 2021 Ian Jackson and contributors to Hippotat
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 // There is NO WARRANTY.
7 // xxx are we using this at all ?
8 #[derive(Default,Clone)]
9 pub struct PacketQueue<D> {
14 impl<D> PacketQueue<D> where D: AsRef<[u8]> {
15 pub fn push_back(&mut self, data: D) {
16 self.content += data.as_ref().len();
17 self.queue.push_back(data);
20 pub fn pop_front(&mut self) -> Option<D> {
21 let data = self.queue.pop_front()?;
22 self.content -= data.as_ref().len();
26 pub fn content_count(&self) -> usize { self.queue.len() }
27 pub fn content_len(&self) -> usize { self.content }
29 pub fn is_empty(&self) -> bool { self.queue.is_empty() }
30 pub fn peek_front(&self) -> Option<&D> { self.queue.front() }
33 #[derive(Default,Clone)]
34 pub struct QueueBuf<E> {
36 eaten1: usize, // 0 <= eaten1 < queue.front()...len()
40 #[derive(Default,Debug,Clone)]
41 pub struct FrameQueueBuf {
42 queue: QueueBuf<Cervine<'static, Box<[u8]>, [u8]>>,
45 impl<E> Debug for QueueBuf<E> where E: AsRef<[u8]> {
47 fn fmt(&self, f: &mut fmt::Formatter) {
48 write!(f, "Queue{{content={},eaten1={},queue=[",
49 self.content, self.eaten1)?;
50 for q in &self.queue { write!(f, "{},", q.as_ref().len())?; }
55 impl<E> QueueBuf<E> where E: AsRef<[u8]> {
56 pub fn push<B: Into<E>>(&mut self, b: B) {
59 fn push_(&mut self, b: E) {
60 let l = b.as_ref().len();
61 self.queue.push_back(b);
64 pub fn is_empty(&self) -> bool { self.content == 0 }
65 pub fn len(&self) -> usize { self.content }
69 pub fn push_esc<B: Into<Box<[u8]>>>(&mut self, b: B) {
70 self.push_esc_(b.into());
72 fn push_esc_(&mut self, b: Box<[u8]>) {
73 self.queue.push_(Cervine::Owned(b));
74 self.queue.push_(Cervine::Borrowed(&SLIP_END_SLICE));
76 pub fn esc_push(&mut self, b: Box<[u8]>) {
77 self.queue.push_(Cervine::Borrowed(&SLIP_END_SLICE));
78 self.queue.push_(Cervine::Owned(b));
80 pub fn push_raw(&mut self, b: Box<[u8]>) {
81 self.queue.push_(Cervine::Owned(b));
83 pub fn is_empty(&self) -> bool { self.queue.is_empty() }
84 pub fn len(&self) -> usize { self.queue.len() }
87 impl<E> hyper::body::Buf for QueueBuf<E> where E: AsRef<[u8]> {
88 fn remaining(&self) -> usize { self.content }
89 fn chunk(&self) -> &[u8] {
90 let front = if let Some(f) = self.queue.front() { f } else { return &[] };
91 &front.as_ref()[ self.eaten1.. ]
93 fn advance(&mut self, cnt: usize) {
97 if self.eaten1 == 0 { break }
98 let front = self.queue.front().unwrap();
99 if self.eaten1 < front.as_ref().len() { break; }
100 self.eaten1 -= front.as_ref().len();
101 self.queue.pop_front().unwrap();
106 impl hyper::body::Buf for FrameQueueBuf {
107 fn remaining(&self) -> usize { self.queue.remaining() }
108 fn chunk(&self) -> &[u8] { self.queue.chunk() }
109 fn advance(&mut self, cnt: usize) { self.queue.advance(cnt) }
113 pub struct BufBody<B:Buf> {
117 impl<B:Buf> BufBody<B> {
118 pub fn new(body: B) -> Self { Self { body: Some(body ) } }
120 impl BufBody<FrameQueueBuf> {
121 pub fn display<S:Display>(s: S) -> Self {
122 let s = s.to_string().into_bytes();
123 let mut buf: FrameQueueBuf = default();
124 buf.push_raw(s.into());
129 impl<B:Buf> HttpBody for BufBody<B> {
132 fn poll_data(self: Pin<&mut Self>, _: &mut std::task::Context<'_>)
133 -> Poll<Option<Result<B, Void>>> {
134 Poll::Ready(Ok(self.project().body.take()).transpose())
136 fn poll_trailers(self: Pin<&mut Self>, _: &mut std::task::Context<'_>)
137 -> Poll<Result<Option<hyper::HeaderMap<hyper::header::HeaderValue>>, Void>> {
138 Poll::Ready(Ok(None))