diff --git a/src/lib.rs b/src/lib.rs index 64649e8..6c7907c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,10 @@ -//! tide tls listener built on async-tls and rustls +//! tide tls listener built on async-rustls and rustls //! //! //! # Example //! ```rust //! # use tide_rustls::TlsListener; -//! fn main() -> tide::Result<()> { async_std::task::block_on(async { +//! # fn main() -> tide::Result<()> { async_std::task::block_on(async { //! let mut app = tide::new(); //! app.at("/").get(|_| async { Ok("Hello tls") }); //! # if false { @@ -15,8 +15,7 @@ //! .key(std::env::var("TIDE_KEY_PATH").unwrap()), //! ) //! .await?; -//! # } -//! # Ok(()) }) } +//! # } Ok(()) }) } //! ``` #![forbid(unsafe_code, future_incompatible)] #![deny( diff --git a/src/tls_listener.rs b/src/tls_listener.rs index 888e753..1fdac5c 100644 --- a/src/tls_listener.rs +++ b/src/tls_listener.rs @@ -27,6 +27,8 @@ pub struct TlsListener { connection: TcpConnection, config: TlsListenerConfig, server: Option>, + tcp_nodelay: Option, + tcp_ttl: Option, } impl Debug for TlsListener { @@ -42,16 +44,25 @@ impl Debug for TlsListener { &"None" }, ) + .field("tcp_ttl", &self.tcp_ttl) + .field("tcp_nodelay", &self.tcp_nodelay) .finish() } } impl TlsListener { - pub(crate) fn new(connection: TcpConnection, config: TlsListenerConfig) -> Self { + pub(crate) fn new( + connection: TcpConnection, + config: TlsListenerConfig, + tcp_nodelay: Option, + tcp_ttl: Option, + ) -> Self { Self { connection, config, server: None, + tcp_nodelay, + tcp_ttl, } } /// The primary entrypoint to create a TlsListener. See @@ -203,7 +214,17 @@ impl Listener for TlsListener handle_tls(server.clone(), stream, acceptor.clone()), + Ok(stream) => { + if let Some(nodelay) = self.tcp_nodelay { + stream.set_nodelay(nodelay)?; + } + + if let Some(ttl) = self.tcp_ttl { + stream.set_ttl(ttl)?; + } + + handle_tls(server.clone(), stream, acceptor.clone()) + } }; } Ok(()) diff --git a/src/tls_listener_builder.rs b/src/tls_listener_builder.rs index 8d7081f..373e7e0 100644 --- a/src/tls_listener_builder.rs +++ b/src/tls_listener_builder.rs @@ -35,6 +35,18 @@ use std::sync::Arc; /// .config(rustls::ServerConfig::new(rustls::NoClientAuth::new())) /// .finish(); /// ``` +/// +/// ```rust +/// # use tide_rustls::TlsListener; +/// let listener = TlsListener::<()>::build() +/// .addrs("localhost:4433") +/// .cert("./tls/localhost-4433.cert") +/// .key("./tls/localhost-4433.key") +/// .tcp_ttl(60) +/// .tcp_nodelay(true) +/// .finish(); +/// ``` + pub struct TlsListenerBuilder { key: Option, cert: Option, @@ -42,6 +54,8 @@ pub struct TlsListenerBuilder { tls_acceptor: Option>, tcp: Option, addrs: Option>, + tcp_nodelay: Option, + tcp_ttl: Option, _state: PhantomData, } @@ -54,6 +68,8 @@ impl Default for TlsListenerBuilder { tls_acceptor: None, tcp: None, addrs: None, + tcp_nodelay: None, + tcp_ttl: None, _state: PhantomData, } } @@ -82,6 +98,8 @@ impl std::fmt::Debug for TlsListenerBuilder { ) .field("tcp", &self.tcp) .field("addrs", &self.addrs) + .field("tcp_nodelay", &self.tcp_nodelay) + .field("tcp_ttl", &self.tcp_ttl) .finish() } } @@ -148,6 +166,18 @@ impl TlsListenerBuilder { self } + /// Provides a TCP_NODELAY option for this tls listener. + pub fn tcp_nodelay(mut self, nodelay: bool) -> Self { + self.tcp_nodelay = Some(nodelay); + self + } + + /// Provides a TTL option for this tls listener, in seconds. + pub fn tcp_ttl(mut self, ttl: u32) -> Self { + self.tcp_ttl = Some(ttl); + self + } + /// finishes building a TlsListener from this TlsListenerBuilder. /// /// # Errors @@ -168,6 +198,8 @@ impl TlsListenerBuilder { tls_acceptor, tcp, addrs, + tcp_nodelay, + tcp_ttl, .. } = self; @@ -194,6 +226,6 @@ impl TlsListenerBuilder { } }; - Ok(TlsListener::new(connection, config)) + Ok(TlsListener::new(connection, config, tcp_nodelay, tcp_ttl)) } }