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 <lishuo.03@bytedance.com>
Co-authored-by: Sean McArthur <sean@seanmonstar.com>
This commit is contained in:
shuo
2020-09-03 09:07:13 +08:00
committed by GitHub
parent f012163333
commit e06e19868f
2 changed files with 46 additions and 1 deletions

View File

@@ -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::<hyper::Error>() {
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 {

View File

@@ -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();