netxserver/server/
maybe_stream.rs1use std::pin::Pin;
2use std::task::{Context, Poll};
3use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
4use tokio::net::TcpStream;
5#[cfg(all(feature = "use_openssl", not(feature = "use_rustls")))]
6use tokio_openssl::SslStream;
7
8#[cfg(all(feature = "use_rustls", not(feature = "use_openssl")))]
9use tokio_rustls::server::TlsStream;
10
11#[derive(Debug)]
13pub enum MaybeStream {
14 Plain(TcpStream),
15 #[cfg(all(feature = "use_openssl", not(feature = "use_rustls")))]
16 ServerSsl(SslStream<TcpStream>),
17 #[cfg(all(feature = "use_rustls", not(feature = "use_openssl")))]
18 ServerTls(TlsStream<TcpStream>),
19}
20
21impl AsyncRead for MaybeStream {
22 #[inline]
33 fn poll_read(
34 self: Pin<&mut Self>,
35 cx: &mut Context<'_>,
36 buf: &mut ReadBuf<'_>,
37 ) -> Poll<std::io::Result<()>> {
38 match self.get_mut() {
39 MaybeStream::Plain(ref mut s) => Pin::new(s).poll_read(cx, buf),
40 #[cfg(all(feature = "use_openssl", not(feature = "use_rustls")))]
41 MaybeStream::ServerSsl(ref mut s) => Pin::new(s).poll_read(cx, buf),
42 #[cfg(all(feature = "use_rustls", not(feature = "use_openssl")))]
43 MaybeStream::ServerTls(ref mut s) => Pin::new(s).poll_read(cx, buf),
44 }
45 }
46}
47
48impl AsyncWrite for MaybeStream {
49 #[inline]
60 fn poll_write(
61 self: Pin<&mut Self>,
62 cx: &mut Context<'_>,
63 buf: &[u8],
64 ) -> Poll<Result<usize, std::io::Error>> {
65 match self.get_mut() {
66 MaybeStream::Plain(ref mut s) => Pin::new(s).poll_write(cx, buf),
67 #[cfg(all(feature = "use_openssl", not(feature = "use_rustls")))]
68 MaybeStream::ServerSsl(ref mut s) => Pin::new(s).poll_write(cx, buf),
69 #[cfg(all(feature = "use_rustls", not(feature = "use_openssl")))]
70 MaybeStream::ServerTls(ref mut s) => Pin::new(s).poll_write(cx, buf),
71 }
72 }
73
74 #[inline]
84 fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), std::io::Error>> {
85 match self.get_mut() {
86 MaybeStream::Plain(ref mut s) => Pin::new(s).poll_flush(cx),
87 #[cfg(all(feature = "use_openssl", not(feature = "use_rustls")))]
88 MaybeStream::ServerSsl(ref mut s) => Pin::new(s).poll_flush(cx),
89 #[cfg(all(feature = "use_rustls", not(feature = "use_openssl")))]
90 MaybeStream::ServerTls(ref mut s) => Pin::new(s).poll_flush(cx),
91 }
92 }
93
94 #[inline]
104 fn poll_shutdown(
105 self: Pin<&mut Self>,
106 cx: &mut Context<'_>,
107 ) -> Poll<Result<(), std::io::Error>> {
108 match self.get_mut() {
109 MaybeStream::Plain(ref mut s) => Pin::new(s).poll_shutdown(cx),
110 #[cfg(all(feature = "use_openssl", not(feature = "use_rustls")))]
111 MaybeStream::ServerSsl(ref mut s) => Pin::new(s).poll_shutdown(cx),
112 #[cfg(all(feature = "use_rustls", not(feature = "use_openssl")))]
113 MaybeStream::ServerTls(ref mut s) => Pin::new(s).poll_shutdown(cx),
114 }
115 }
116}