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:
		
							
								
								
									
										18
									
								
								src/error.rs
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								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::<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 { | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user