monoio_rustls_fork_shadow_tls/
server.rs1use std::sync::Arc;
2
3use monoio::io::{AsyncReadRent, AsyncWriteRent, OwnedReadHalf, OwnedWriteHalf};
4use rustls_fork_shadow_tls::{ServerConfig, ServerConnection};
5
6use crate::{stream::Stream, TlsError};
7
8pub type TlsStream<IO> = Stream<IO, ServerConnection>;
10pub type TlsStreamReadHalf<IO> = OwnedReadHalf<TlsStream<IO>>;
12pub type TlsStreamWriteHalf<IO> = OwnedWriteHalf<TlsStream<IO>>;
14
15#[derive(Clone)]
17pub struct TlsAcceptor {
18 inner: Arc<ServerConfig>,
19 #[cfg(feature = "unsafe_io")]
20 unsafe_io: bool,
21}
22
23impl From<Arc<ServerConfig>> for TlsAcceptor {
24 fn from(inner: Arc<ServerConfig>) -> TlsAcceptor {
25 TlsAcceptor {
26 inner,
27 #[cfg(feature = "unsafe_io")]
28 unsafe_io: false,
29 }
30 }
31}
32
33impl From<ServerConfig> for TlsAcceptor {
34 fn from(inner: ServerConfig) -> TlsAcceptor {
35 TlsAcceptor {
36 inner: Arc::new(inner),
37 #[cfg(feature = "unsafe_io")]
38 unsafe_io: false,
39 }
40 }
41}
42
43impl TlsAcceptor {
44 #[cfg(feature = "unsafe_io")]
49 pub unsafe fn unsafe_io(self, enabled: bool) -> Self {
50 Self {
51 unsafe_io: enabled,
52 ..self
53 }
54 }
55
56 pub async fn accept<IO>(&self, stream: IO) -> Result<TlsStream<IO>, TlsError>
57 where
58 IO: AsyncReadRent + AsyncWriteRent,
59 {
60 let session = ServerConnection::new(self.inner.clone())?;
61 #[cfg(feature = "unsafe_io")]
62 let mut stream = if self.unsafe_io {
63 unsafe { Stream::new_unsafe(stream, session) }
66 } else {
67 Stream::new(stream, session)
68 };
69 #[cfg(not(feature = "unsafe_io"))]
70 let mut stream = Stream::new(stream, session);
71 stream.handshake().await?;
72 Ok(stream)
73 }
74}