From e85e7b60e707f10c97d37608936cedf08fc2bfa9 Mon Sep 17 00:00:00 2001 From: fiag Date: Mon, 1 Mar 2021 21:30:02 +0800 Subject: [PATCH 1/4] 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, } } } From 93ea7c3b87c8853d1f5dbce0c43651a8d9e1b41b Mon Sep 17 00:00:00 2001 From: Qing Lei Date: Tue, 2 Mar 2021 23:00:57 +0800 Subject: [PATCH 2/4] enable tcp_nodelay by default --- src/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.rs b/src/server.rs index 9c84f539f..8c0834719 100644 --- a/src/server.rs +++ b/src/server.rs @@ -114,7 +114,7 @@ where Arc::new(log::LogMiddleware::new()), ]), state, - tcp_nodelay: false, + tcp_nodelay: true, } } From 480f5bad5816c0329c1c47011d91f2f7c23703c8 Mon Sep 17 00:00:00 2001 From: fiag Date: Fri, 9 Apr 2021 21:48:21 +0800 Subject: [PATCH 3/4] Update: move tcp_nodelay option to tcp_listener --- src/listener/tcp_listener.rs | 33 ++++++++++++++++++++++++++++++--- src/server.rs | 29 ----------------------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/listener/tcp_listener.rs b/src/listener/tcp_listener.rs index 7342c62e0..069c86bc5 100644 --- a/src/listener/tcp_listener.rs +++ b/src/listener/tcp_listener.rs @@ -22,6 +22,7 @@ pub struct TcpListener { listener: Option, server: Option>, info: Option, + tcp_nodelay: bool, } impl TcpListener { @@ -31,6 +32,7 @@ impl TcpListener { listener: None, server: None, info: None, + tcp_nodelay: true, } } @@ -40,13 +42,38 @@ impl TcpListener { listener: Some(tcp_listener.into()), server: None, info: None, + tcp_nodelay: true, } } + + /// 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.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 + } } -fn handle_tcp(app: Server, stream: TcpStream) { +fn handle_tcp(app: Server, stream: TcpStream, tcp_nodelay: bool) { task::spawn(async move { - stream.set_nodelay(app.tcp_nodelay()).ok(); + stream.set_nodelay(tcp_nodelay).ok(); let local_addr = stream.local_addr().ok(); let peer_addr = stream.peer_addr().ok(); @@ -112,7 +139,7 @@ where } Ok(stream) => { - handle_tcp(server.clone(), stream); + handle_tcp(server.clone(), stream, self.tcp_nodelay); } }; } diff --git a/src/server.rs b/src/server.rs index 8c0834719..bff2266a3 100644 --- a/src/server.rs +++ b/src/server.rs @@ -38,7 +38,6 @@ 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<()> { @@ -114,7 +113,6 @@ where Arc::new(log::LogMiddleware::new()), ]), state, - tcp_nodelay: true, } } @@ -288,7 +286,6 @@ where router, state, middleware, - tcp_nodelay: _tcp_nodelay, } = self.clone(); let method = req.method().to_owned(); @@ -320,31 +317,6 @@ 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 { @@ -359,7 +331,6 @@ impl Clone for Server { router: self.router.clone(), state: self.state.clone(), middleware: self.middleware.clone(), - tcp_nodelay: self.tcp_nodelay, } } } From c6a885e12bad6ee3f64aec6b7b2c4cce1d324ba1 Mon Sep 17 00:00:00 2001 From: fiag Date: Fri, 9 Apr 2021 23:01:20 +0800 Subject: [PATCH 4/4] remove example --- src/listener/tcp_listener.rs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/listener/tcp_listener.rs b/src/listener/tcp_listener.rs index 069c86bc5..a17796227 100644 --- a/src/listener/tcp_listener.rs +++ b/src/listener/tcp_listener.rs @@ -52,19 +52,6 @@ impl TcpListener { } /// 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.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