From e85e7b60e707f10c97d37608936cedf08fc2bfa9 Mon Sep 17 00:00:00 2001 From: fiag Date: Mon, 1 Mar 2021 21:30:02 +0800 Subject: [PATCH] add tcp nodelay option --- src/listener/tcp_listener.rs | 1 + src/server.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/listener/tcp_listener.rs b/src/listener/tcp_listener.rs index 9ca3585f8..7342c62e0 100644 --- a/src/listener/tcp_listener.rs +++ b/src/listener/tcp_listener.rs @@ -46,6 +46,7 @@ impl TcpListener { fn handle_tcp(app: Server, stream: TcpStream) { task::spawn(async move { + stream.set_nodelay(app.tcp_nodelay()).ok(); let local_addr = stream.local_addr().ok(); let peer_addr = stream.peer_addr().ok(); diff --git a/src/server.rs b/src/server.rs index bff2266a3..9c84f539f 100644 --- a/src/server.rs +++ b/src/server.rs @@ -38,6 +38,7 @@ pub struct Server { /// We don't use a Mutex around the Vec here because adding a middleware during execution should be an error. #[allow(clippy::rc_buffer)] middleware: Arc>>>, + tcp_nodelay: bool, } impl Server<()> { @@ -113,6 +114,7 @@ where Arc::new(log::LogMiddleware::new()), ]), state, + tcp_nodelay: false, } } @@ -286,6 +288,7 @@ where router, state, middleware, + tcp_nodelay: _tcp_nodelay, } = self.clone(); let method = req.method().to_owned(); @@ -317,6 +320,31 @@ where pub fn state(&self) -> &State { &self.state } + + /// Gets the value of the TCP_NODELAY option for tcp connections. + pub fn tcp_nodelay(&self) -> bool { + self.tcp_nodelay + } + + /// Set the TCP_NODELAY option for tcp connections. + /// + /// # Examples + /// + /// ```no_run + /// # use async_std::task::block_on; + /// # fn main() -> Result<(), std::io::Error> { block_on(async { + /// # + /// let mut app = tide::new(); + /// app.at("/").get(|_| async { Ok("Hello, world!") }); + /// app.set_tcp_nodelay(true); + /// app.listen("127.0.0.1:8080").await?; + /// # + /// # Ok(()) }) } + /// ``` + pub fn set_tcp_nodelay(&mut self, tcp_nodelay: bool) -> &mut Self { + self.tcp_nodelay = tcp_nodelay; + self + } } impl std::fmt::Debug for Server { @@ -331,6 +359,7 @@ impl Clone for Server { router: self.router.clone(), state: self.state.clone(), middleware: self.middleware.clone(), + tcp_nodelay: self.tcp_nodelay, } } }