1mod error;
2mod framed_read;
3mod framed_write;
4
5pub use self::error::{SendError, UserError};
6
7use self::framed_read::FramedRead;
8use self::framed_write::FramedWrite;
9
10use crate::frame::{self, Data, Frame};
11use crate::proto::Error;
12
13use bytes::Buf;
14use futures_core::Stream;
15use futures_sink::Sink;
16use std::pin::Pin;
17use std::task::{Context, Poll};
18use tokio::io::{AsyncRead, AsyncWrite};
19use tokio_util::codec::length_delimited;
20
21use std::io;
22
23#[derive(Debug)]
24pub struct Codec<T, B> {
25 inner: FramedRead<FramedWrite<T, B>>,
26}
27
28impl<T, B> Codec<T, B>
29where
30 T: AsyncRead + AsyncWrite + Unpin,
31 B: Buf,
32{
33 #[inline]
35 pub fn new(io: T) -> Self {
36 Self::with_max_recv_frame_size(io, frame::DEFAULT_MAX_FRAME_SIZE as usize)
37 }
38
39 pub fn with_max_recv_frame_size(io: T, max_frame_size: usize) -> Self {
41 let framed_write = FramedWrite::new(io);
43
44 let delimited = length_delimited::Builder::new()
46 .big_endian()
47 .length_field_length(3)
48 .length_adjustment(9)
49 .num_skip(0) .new_read(framed_write);
51
52 let mut inner = FramedRead::new(delimited);
53
54 inner.set_max_frame_size(max_frame_size);
56
57 Codec { inner }
58 }
59}
60
61impl<T, B> Codec<T, B> {
62 #[inline]
69 pub fn set_max_recv_frame_size(&mut self, val: usize) {
70 self.inner.set_max_frame_size(val)
71 }
72
73 #[cfg(feature = "unstable")]
78 #[inline]
79 pub fn max_recv_frame_size(&self) -> usize {
80 self.inner.max_frame_size()
81 }
82
83 pub fn max_send_frame_size(&self) -> usize {
85 self.inner.get_ref().max_frame_size()
86 }
87
88 pub fn set_max_send_frame_size(&mut self, val: usize) {
90 self.framed_write().set_max_frame_size(val)
91 }
92
93 pub fn set_send_header_table_size(&mut self, val: usize) {
95 self.framed_write().set_header_table_size(val)
96 }
97
98 pub fn set_recv_header_table_size(&mut self, val: usize) {
100 self.inner.set_header_table_size(val)
101 }
102
103 pub fn set_max_recv_header_list_size(&mut self, val: usize) {
105 self.inner.set_max_header_list_size(val);
106 }
107
108 #[cfg(feature = "unstable")]
110 pub fn get_ref(&self) -> &T {
111 self.inner.get_ref().get_ref()
112 }
113
114 pub fn get_mut(&mut self) -> &mut T {
116 self.inner.get_mut().get_mut()
117 }
118
119 pub(crate) fn take_last_data_frame(&mut self) -> Option<Data<B>> {
121 self.framed_write().take_last_data_frame()
122 }
123
124 fn framed_write(&mut self) -> &mut FramedWrite<T, B> {
125 self.inner.get_mut()
126 }
127}
128
129impl<T, B> Codec<T, B>
130where
131 T: AsyncWrite + Unpin,
132 B: Buf,
133{
134 pub fn poll_ready(&mut self, cx: &mut Context) -> Poll<io::Result<()>> {
136 self.framed_write().poll_ready(cx)
137 }
138
139 pub(crate) fn has_send_capacity(&mut self) -> bool {
142 self.framed_write().has_capacity()
143 }
144
145 pub fn buffer(&mut self, item: Frame<B>) -> Result<(), UserError> {
152 self.framed_write().buffer(item)
153 }
154
155 pub fn flush(&mut self, cx: &mut Context) -> Poll<io::Result<()>> {
157 self.framed_write().flush(cx)
158 }
159
160 pub fn shutdown(&mut self, cx: &mut Context) -> Poll<io::Result<()>> {
162 self.framed_write().shutdown(cx)
163 }
164}
165
166impl<T, B> Stream for Codec<T, B>
167where
168 T: AsyncRead + Unpin,
169{
170 type Item = Result<Frame, Error>;
171
172 fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
173 Pin::new(&mut self.inner).poll_next(cx)
174 }
175}
176
177impl<T, B> Sink<Frame<B>> for Codec<T, B>
178where
179 T: AsyncWrite + Unpin,
180 B: Buf,
181{
182 type Error = SendError;
183
184 fn start_send(mut self: Pin<&mut Self>, item: Frame<B>) -> Result<(), Self::Error> {
185 Codec::buffer(&mut self, item)?;
186 Ok(())
187 }
188 fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
190 self.framed_write().poll_ready(cx).map_err(Into::into)
191 }
192
193 fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
195 self.framed_write().flush(cx).map_err(Into::into)
196 }
197
198 fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
199 ready!(self.shutdown(cx))?;
200 Poll::Ready(Ok(()))
201 }
202}
203
204impl<T> From<T> for Codec<T, bytes::Bytes>
206where
207 T: AsyncRead + AsyncWrite + Unpin,
208{
209 fn from(src: T) -> Self {
210 Self::new(src)
211 }
212}