1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
use crate::transport::{server::Connected, Certificate}; use hyper::client::connect::{Connected as HyperConnected, Connection}; use std::io; use std::net::SocketAddr; use std::pin::Pin; use std::task::{Context, Poll}; use tokio::io::{AsyncRead, AsyncWrite}; pub(in crate::transport) trait Io: AsyncRead + AsyncWrite + Send + 'static { } impl<T> Io for T where T: AsyncRead + AsyncWrite + Send + 'static {} pub(crate) struct BoxedIo(Pin<Box<dyn Io>>); impl BoxedIo { pub(in crate::transport) fn new<I: Io>(io: I) -> Self { BoxedIo(Box::pin(io)) } } impl Connection for BoxedIo { fn connected(&self) -> HyperConnected { HyperConnected::new() } } impl Connected for BoxedIo {} impl AsyncRead for BoxedIo { fn poll_read( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll<io::Result<usize>> { Pin::new(&mut self.0).poll_read(cx, buf) } } impl AsyncWrite for BoxedIo { fn poll_write( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll<io::Result<usize>> { Pin::new(&mut self.0).poll_write(cx, buf) } fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { Pin::new(&mut self.0).poll_flush(cx) } fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { Pin::new(&mut self.0).poll_shutdown(cx) } } pub(in crate::transport) trait ConnectedIo: Io + Connected {} impl<T> ConnectedIo for T where T: Io + Connected {} pub(crate) struct ServerIo(Pin<Box<dyn ConnectedIo>>); impl ServerIo { pub(in crate::transport) fn new<I: ConnectedIo>(io: I) -> Self { ServerIo(Box::pin(io)) } } impl Connected for ServerIo { fn remote_addr(&self) -> Option<SocketAddr> { (&*self.0).remote_addr() } fn peer_certs(&self) -> Option<Vec<Certificate>> { (&self.0).peer_certs() } } impl AsyncRead for ServerIo { fn poll_read( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll<io::Result<usize>> { Pin::new(&mut self.0).poll_read(cx, buf) } } impl AsyncWrite for ServerIo { fn poll_write( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll<io::Result<usize>> { Pin::new(&mut self.0).poll_write(cx, buf) } fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { Pin::new(&mut self.0).poll_flush(cx) } fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { Pin::new(&mut self.0).poll_shutdown(cx) } }