Skip to main content

http_request/request/proxy/
impl.rs

1use super::*;
2
3impl ProxyTunnelStream {
4    pub(crate) fn new(stream: BoxAsyncReadWrite, pre_read_data: Vec<u8>) -> Self {
5        Self {
6            inner: stream,
7            pre_read_data,
8        }
9    }
10}
11
12impl AsyncRead for ProxyTunnelStream {
13    fn poll_read(
14        mut self: Pin<&mut Self>,
15        cx: &mut Context<'_>,
16        buf: &mut ReadBuf<'_>,
17    ) -> Poll<std::io::Result<()>> {
18        if !self.pre_read_data.is_empty() {
19            let len: usize = std::cmp::min(self.pre_read_data.len(), buf.remaining());
20            buf.put_slice(&self.pre_read_data[..len]);
21            self.pre_read_data.drain(..len);
22            return Poll::Ready(Ok(()));
23        }
24        Pin::new(&mut self.inner).poll_read(cx, buf)
25    }
26}
27
28impl AsyncWrite for ProxyTunnelStream {
29    fn poll_write(
30        mut self: Pin<&mut Self>,
31        cx: &mut Context<'_>,
32        buf: &[u8],
33    ) -> Poll<Result<usize, std::io::Error>> {
34        Pin::new(&mut self.inner).poll_write(cx, buf)
35    }
36
37    fn poll_flush(
38        mut self: Pin<&mut Self>,
39        cx: &mut Context<'_>,
40    ) -> Poll<Result<(), std::io::Error>> {
41        Pin::new(&mut self.inner).poll_flush(cx)
42    }
43
44    fn poll_shutdown(
45        mut self: Pin<&mut Self>,
46        cx: &mut Context<'_>,
47    ) -> Poll<Result<(), std::io::Error>> {
48        Pin::new(&mut self.inner).poll_shutdown(cx)
49    }
50}
51
52impl Unpin for ProxyTunnelStream {}
53
54impl SyncProxyTunnelStream {
55    pub(crate) fn new(stream: BoxReadWrite, pre_read_data: Vec<u8>) -> Self {
56        Self {
57            inner: stream,
58            pre_read_data,
59        }
60    }
61}
62
63impl Read for SyncProxyTunnelStream {
64    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
65        if !self.pre_read_data.is_empty() {
66            let len: usize = std::cmp::min(self.pre_read_data.len(), buf.len());
67            buf[..len].copy_from_slice(&self.pre_read_data[..len]);
68            self.pre_read_data.drain(..len);
69            return Ok(len);
70        }
71        self.inner.read(buf)
72    }
73}
74
75impl Write for SyncProxyTunnelStream {
76    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
77        self.inner.write(buf)
78    }
79
80    fn flush(&mut self) -> std::io::Result<()> {
81        self.inner.flush()
82    }
83}