| @@ -53,7 +53,7 @@ pub struct Client { | |||||||
| /// ``` | /// ``` | ||||||
| pub struct ClientBuilder { | pub struct ClientBuilder { | ||||||
|     inner: async_impl::ClientBuilder, |     inner: async_impl::ClientBuilder, | ||||||
|     timeout: Option<Duration>, |     timeout: Timeout, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl ClientBuilder { | impl ClientBuilder { | ||||||
| @@ -65,7 +65,7 @@ impl ClientBuilder { | |||||||
|     pub fn new() -> ::Result<ClientBuilder> { |     pub fn new() -> ::Result<ClientBuilder> { | ||||||
|         async_impl::ClientBuilder::new().map(|builder| ClientBuilder { |         async_impl::ClientBuilder::new().map(|builder| ClientBuilder { | ||||||
|             inner: builder, |             inner: builder, | ||||||
|             timeout: None, |             timeout: Timeout::default(), | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -212,9 +212,15 @@ impl ClientBuilder { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Set a timeout for connect, read and write operations of a `Client`. |     /// Set a timeout for connect, read and write operations of a `Client`. | ||||||
|  |     /// | ||||||
|  |     /// Default is 30 seconds. | ||||||
|  |     /// | ||||||
|  |     /// Pass `None` to disable timeout. | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn timeout(&mut self, timeout: Duration) -> &mut ClientBuilder { |     pub fn timeout<T>(&mut self, timeout: T) -> &mut ClientBuilder | ||||||
|         self.timeout = Some(timeout); |     where T: Into<Option<Duration>>, | ||||||
|  |     { | ||||||
|  |         self.timeout = Timeout(timeout.into()); | ||||||
|         self |         self | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -344,7 +350,7 @@ impl fmt::Debug for ClientBuilder { | |||||||
|  |  | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| struct ClientHandle { | struct ClientHandle { | ||||||
|     timeout: Option<Duration>, |     timeout: Timeout, | ||||||
|     inner: Arc<InnerClientHandle> |     inner: Arc<InnerClientHandle> | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -404,7 +410,7 @@ impl ClientHandle { | |||||||
|             let _ = core.run(work); |             let _ = core.run(work); | ||||||
|         })); |         })); | ||||||
|  |  | ||||||
|         wait::timeout(spawn_rx, timeout).expect("core thread cancelled")?; |         wait::timeout(spawn_rx, timeout.0).expect("core thread cancelled")?; | ||||||
|  |  | ||||||
|         let inner_handle = Arc::new(InnerClientHandle { |         let inner_handle = Arc::new(InnerClientHandle { | ||||||
|             tx: Some(tx), |             tx: Some(tx), | ||||||
| @@ -432,7 +438,7 @@ impl ClientHandle { | |||||||
|             try_!(body.send(), &url); |             try_!(body.send(), &url); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         let res = match wait::timeout(rx, self.timeout) { |         let res = match wait::timeout(rx, self.timeout.0) { | ||||||
|             Ok(res) => res, |             Ok(res) => res, | ||||||
|             Err(wait::Waited::TimedOut) => return Err(::error::timedout(Some(url))), |             Err(wait::Waited::TimedOut) => return Err(::error::timedout(Some(url))), | ||||||
|             Err(wait::Waited::Err(_canceled)) => { |             Err(wait::Waited::Err(_canceled)) => { | ||||||
| @@ -445,11 +451,22 @@ impl ClientHandle { | |||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|         res.map(|res| { |         res.map(|res| { | ||||||
|             response::new(res, self.timeout, KeepCoreThreadAlive(self.inner.clone())) |             response::new(res, self.timeout.0, KeepCoreThreadAlive(self.inner.clone())) | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[derive(Clone, Copy)] | ||||||
|  | struct Timeout(Option<Duration>); | ||||||
|  |  | ||||||
|  | impl Default for Timeout { | ||||||
|  |     #[inline] | ||||||
|  |     fn default() -> Timeout { | ||||||
|  |         // default mentioned in ClientBuilder::timeout() doc comment | ||||||
|  |         Timeout(Some(Duration::from_secs(30))) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| // pub(crate) | // pub(crate) | ||||||
|  |  | ||||||
| pub struct KeepCoreThreadAlive(Arc<InnerClientHandle>); | pub struct KeepCoreThreadAlive(Arc<InnerClientHandle>); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user