From 02cb96ac2d7ee1bbf308030aa4d00aeecc5be47a Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Thu, 14 Jul 2016 17:23:13 -0700 Subject: [PATCH 1/2] feat(server): add idle_timeout to Server Closes #790 --- src/server/mod.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 710af91e..85654e77 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -117,6 +117,7 @@ impl Server where A::Output: Transport { config.slab_capacity(self.max_sockets); config.mio().notify_capacity(self.max_sockets); let keep_alive = self.keep_alive; + let idle_timeout = self.idle_timeout; let mut loop_ = rotor::Loop::new(&config).unwrap(); let mut notifier = None; { @@ -135,8 +136,9 @@ impl Server where A::Output: Transport { }; let server = ServerLoop { inner: Some((loop_, Context { + factory: factory, + idle_timeout: idle_timeout, keep_alive: keep_alive, - factory: factory })) }; Ok((listening, server)) @@ -162,8 +164,9 @@ impl> Drop for ServerLoop { } struct Context { - keep_alive: bool, factory: F, + idle_timeout: Option, + keep_alive: bool, } impl, T: Transport> http::MessageHandlerFactory<(), T> for Context { @@ -174,7 +177,11 @@ impl, T: Transport> http::MessageHandlerFactory<(), T> for } fn keep_alive_interest(&self) -> Next { - Next::read() + if let Some(dur) = self.idle_timeout { + Next::read().timeout(dur) + } else { + Next::read() + } } } From 976218badc4a067e45a9d15af7e4eb5f2a4adc09 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Thu, 14 Jul 2016 17:24:19 -0700 Subject: [PATCH 2/2] feat(client): add keep_alive_timeout to Client --- src/client/mod.rs | 15 +++++++++++++++ src/server/mod.rs | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 5a9bc61f..50bd0d79 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -145,6 +145,8 @@ pub struct Config { connect_timeout: Duration, connector: C, keep_alive: bool, + keep_alive_timeout: Option, + //TODO: make use of max_idle config max_idle: usize, max_sockets: usize, } @@ -157,6 +159,7 @@ impl Config where C: Connect + Send + 'static { connect_timeout: self.connect_timeout, connector: val, keep_alive: self.keep_alive, + keep_alive_timeout: Some(Duration::from_secs(60 * 2)), max_idle: self.max_idle, max_sockets: self.max_sockets, } @@ -171,6 +174,17 @@ impl Config where C: Connect + Send + 'static { self } + /// Set an optional timeout for idle sockets being kept-alive. + /// + /// Pass `None` to disable timeout. + /// + /// Default is 2 minutes. + #[inline] + pub fn keep_alive_timeout(mut self, val: Option) -> Config { + self.keep_alive_timeout = val; + self + } + /// Set the max table size allocated for holding on to live sockets. /// /// Default is 1024. @@ -202,6 +216,7 @@ impl Default for Config { connect_timeout: Duration::from_secs(10), connector: DefaultConnector::default(), keep_alive: true, + keep_alive_timeout: Some(Duration::from_secs(60 * 2)), max_idle: 5, max_sockets: 1024, } diff --git a/src/server/mod.rs b/src/server/mod.rs index 85654e77..c3a5dbd1 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -40,7 +40,7 @@ impl> fmt::Debug for ServerLoop { pub struct Server { listener: T, keep_alive: bool, - idle_timeout: Duration, + idle_timeout: Option, max_sockets: usize, } @@ -51,7 +51,7 @@ impl Server where T: Accept, T::Output: Transport { Server { listener: listener, keep_alive: true, - idle_timeout: Duration::from_secs(10), + idle_timeout: Some(Duration::from_secs(10)), max_sockets: 4096, } } @@ -67,7 +67,7 @@ impl Server where T: Accept, T::Output: Transport { /// Sets how long an idle connection will be kept before closing. /// /// Default is 10 seconds. - pub fn idle_timeout(mut self, val: Duration) -> Server { + pub fn idle_timeout(mut self, val: Option) -> Server { self.idle_timeout = val; self }