From e06e19868f6deb9e8e421e545b90cdfb2902ba94 Mon Sep 17 00:00:00 2001 From: shuo Date: Thu, 3 Sep 2020 09:07:13 +0800 Subject: [PATCH] Add is_connect on error (#1023) * error: add is_connect helper function * test: ensure request_timeout is not connect_timeout * fmt * skip err is_connect if target_arch is wasm. rerun checks Co-authored-by: lishuo Co-authored-by: Sean McArthur --- src/error.rs | 18 ++++++++++++++++++ tests/timeouts.rs | 29 ++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/error.rs b/src/error.rs index b8e84b5..cb05eb7 100644 --- a/src/error.rs +++ b/src/error.rs @@ -102,6 +102,24 @@ impl Error { } } + #[cfg(not(target_arch = "wasm32"))] + /// Returns true if the error is related to connect + pub fn is_connect(&self) -> bool { + let mut source = self.source(); + + while let Some(err) = source { + if let Some(hyper_err) = err.downcast_ref::() { + if hyper_err.is_connect() { + return true; + } + } + + source = err.source(); + } + + false + } + /// Returns true if the error is related to the request or response body pub fn is_body(&self) -> bool { match self.inner.kind { diff --git a/tests/timeouts.rs b/tests/timeouts.rs index 4a8880e..8c3a269 100644 --- a/tests/timeouts.rs +++ b/tests/timeouts.rs @@ -54,10 +54,37 @@ async fn request_timeout() { let err = res.unwrap_err(); - assert!(err.is_timeout()); + if cfg!(not(target_arch = "wasm32")) { + assert!(err.is_timeout() && !err.is_connect()); + } else { + assert!(err.is_timeout()); + } assert_eq!(err.url().map(|u| u.as_str()), Some(url.as_str())); } +#[cfg(not(target_arch = "wasm32"))] +#[tokio::test] +async fn connect_timeout() { + let _ = env_logger::try_init(); + + let client = reqwest::Client::builder() + .connect_timeout(Duration::from_millis(100)) + .build() + .unwrap(); + + let url = format!("http://10.255.255.1:81/slow"); + + let res = client + .get(&url) + .timeout(Duration::from_millis(1000)) + .send() + .await; + + let err = res.unwrap_err(); + + assert!(err.is_connect() && err.is_timeout()); +} + #[tokio::test] async fn response_timeout() { let _ = env_logger::try_init();