From d73d96116635e67ba4a21ee657a8218d0aaee37a Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Tue, 30 Nov 2021 10:03:54 -0800 Subject: [PATCH] fix blocking client to use request timeout for response body (#1395) --- src/blocking/client.rs | 2 +- tests/timeouts.rs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/blocking/client.rs b/src/blocking/client.rs index d3548e12b..8da4251b3 100644 --- a/src/blocking/client.rs +++ b/src/blocking/client.rs @@ -1039,7 +1039,7 @@ impl ClientHandle { Ok(Err(err)) => Err(err.with_url(url)), Ok(Ok(res)) => Ok(Response::new( res, - self.timeout.0, + timeout, KeepCoreThreadAlive(Some(self.inner.clone())), )), Err(wait::Waited::TimedOut(e)) => Err(crate::error::request(e).with_url(url)), diff --git a/tests/timeouts.rs b/tests/timeouts.rs index d2c7289c7..eca56a1b8 100644 --- a/tests/timeouts.rs +++ b/tests/timeouts.rs @@ -174,6 +174,43 @@ fn timeout_blocking_request() { assert_eq!(err.url().map(|u| u.as_str()), Some(url.as_str())); } +#[cfg(feature = "blocking")] +#[test] +fn blocking_request_timeout_body() { + let _ = env_logger::try_init(); + + let client = reqwest::blocking::Client::builder() + // this should be overridden + .connect_timeout(Duration::from_millis(200)) + // this should be overridden + .timeout(Duration::from_millis(200)) + .build() + .unwrap(); + + let server = server::http(move |_req| { + async { + // immediate response, but delayed body + let body = hyper::Body::wrap_stream(futures_util::stream::once(async { + tokio::time::sleep(Duration::from_secs(1)).await; + Ok::<_, std::convert::Infallible>("Hello") + })); + + http::Response::new(body) + } + }); + + let url = format!("http://{}/closes", server.addr()); + let res = client + .get(&url) + // longer than client timeout + .timeout(Duration::from_secs(5)) + .send() + .expect("get response"); + + let text = res.text().unwrap(); + assert_eq!(text, "Hello"); +} + #[cfg(feature = "blocking")] #[test] fn write_timeout_large_body() {