Skip to content

Commit 9e3f4f5

Browse files
committed
feat: add Request::read_timeout
1 parent acd1b05 commit 9e3f4f5

File tree

4 files changed

+39
-14
lines changed

4 files changed

+39
-14
lines changed

src/async_impl/client.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use super::Body;
1717
use crate::async_impl::h3_client::connect::{H3ClientConfig, H3Connector};
1818
#[cfg(feature = "http3")]
1919
use crate::async_impl::h3_client::H3Client;
20-
use crate::config::{RequestConfig, RequestTimeout};
20+
use crate::config::{RequestConfig, RequestTimeout, ReadTimeout};
2121
#[cfg(unix)]
2222
use crate::connect::uds::UnixSocketProvider;
2323
use crate::connect::{
@@ -1036,7 +1036,7 @@ impl ClientBuilder {
10361036
},
10371037
headers: config.headers,
10381038
referer: config.referer,
1039-
read_timeout: config.read_timeout,
1039+
read_timeout: RequestConfig::new(config.read_timeout),
10401040
request_timeout: RequestConfig::new(config.timeout),
10411041
hyper,
10421042
proxies,
@@ -2554,11 +2554,8 @@ impl Client {
25542554
.map(tokio::time::sleep)
25552555
.map(Box::pin);
25562556

2557-
let read_timeout_fut = self
2558-
.inner
2559-
.read_timeout
2560-
.map(tokio::time::sleep)
2561-
.map(Box::pin);
2557+
let read_timeout = self.inner.read_timeout.fetch(&extensions).copied();
2558+
let read_timeout_fut = read_timeout.map(tokio::time::sleep).map(Box::pin);
25622559

25632560
Pending {
25642561
inner: PendingInner::Request(Box::pin(PendingRequest {
@@ -2571,7 +2568,7 @@ impl Client {
25712568
in_flight,
25722569
total_timeout,
25732570
read_timeout_fut,
2574-
read_timeout: self.inner.read_timeout,
2571+
read_timeout,
25752572
})),
25762573
}
25772574
}
@@ -2812,7 +2809,7 @@ struct ClientRef {
28122809
h3_client: Option<LayeredService<H3Client>>,
28132810
referer: bool,
28142811
request_timeout: RequestConfig<RequestTimeout>,
2815-
read_timeout: Option<Duration>,
2812+
read_timeout: RequestConfig<ReadTimeout>,
28162813
proxies: Arc<Vec<ProxyMatcher>>,
28172814
proxies_maybe_http_auth: bool,
28182815
proxies_maybe_http_custom_headers: bool,
@@ -2849,10 +2846,7 @@ impl ClientRef {
28492846
f.field("default_headers", &self.headers);
28502847

28512848
self.request_timeout.fmt_as_field(f);
2852-
2853-
if let Some(ref d) = self.read_timeout {
2854-
f.field("read_timeout", d);
2855-
}
2849+
self.read_timeout.fmt_as_field(f);
28562850
}
28572851
}
28582852

src/async_impl/request.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use super::client::{Client, Pending};
1212
#[cfg(feature = "multipart")]
1313
use super::multipart;
1414
use super::response::Response;
15-
use crate::config::{RequestConfig, RequestTimeout};
15+
use crate::config::{ReadTimeout, RequestConfig, RequestTimeout};
1616
#[cfg(feature = "multipart")]
1717
use crate::header::CONTENT_LENGTH;
1818
use crate::header::{HeaderMap, HeaderName, HeaderValue, CONTENT_TYPE};
@@ -124,6 +124,18 @@ impl Request {
124124
RequestConfig::<RequestTimeout>::get_mut(&mut self.extensions)
125125
}
126126

127+
/// Get the read timeout.
128+
#[inline]
129+
pub fn read_timeout(&self) -> Option<&Duration> {
130+
RequestConfig::<ReadTimeout>::get(&self.extensions)
131+
}
132+
133+
/// Get a mutable reference to the read timeout.
134+
#[inline]
135+
pub fn read_timeout_mut(&mut self) -> &mut Option<Duration> {
136+
RequestConfig::<ReadTimeout>::get_mut(&mut self.extensions)
137+
}
138+
127139
/// Get the http version.
128140
#[inline]
129141
pub fn version(&self) -> Version {

src/blocking/request.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,18 @@ impl Request {
113113
self.inner.timeout_mut()
114114
}
115115

116+
/// Get the read timeout.
117+
#[inline]
118+
pub fn read_timeout(&self) -> Option<&Duration> {
119+
self.inner.read_timeout()
120+
}
121+
122+
/// Get a mutable reference to the read timeout.
123+
#[inline]
124+
pub fn read_timeout_mut(&mut self) -> &mut Option<Duration> {
125+
self.inner.read_timeout_mut()
126+
}
127+
116128
/// Attempts to clone the `Request`.
117129
///
118130
/// None is returned if a body is which can not be cloned. This can be because the body is a

src/config.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,10 @@ pub(crate) struct RequestTimeout;
108108
impl RequestConfigValue for RequestTimeout {
109109
type Value = Duration;
110110
}
111+
112+
#[derive(Clone, Copy)]
113+
pub(crate) struct ReadTimeout;
114+
115+
impl RequestConfigValue for ReadTimeout {
116+
type Value = Duration;
117+
}

0 commit comments

Comments
 (0)