Add timing info for libcurl < 7.61 (using second function timings).

This commit is contained in:
jcamiel 2023-04-26 13:50:41 +02:00
parent e4a373266b
commit 749ba0eca2
No known key found for this signature in database
GPG Key ID: 07FF11CFD55356CC
4 changed files with 36 additions and 23 deletions

View File

@ -328,7 +328,7 @@ impl Client {
};
let stop = Utc::now();
let duration = (stop - start).to_std().unwrap();
let timings = Timings::new(&self.handle, start, stop);
let timings = Timings::new(&mut self.handle, start, stop);
self.handle.reset();
let request = Request {

View File

@ -107,7 +107,7 @@ pub fn get_certinfo(easy: &Easy) -> Result<Option<CertInfo>, Error> {
///
/// Corresponds to [`CURLINFO_NAMELOOKUP_TIME_T`] and may return an error if the
/// option isn't supported.
pub fn namelookup_time_t(easy: &Easy) -> Result<Duration, Error> {
pub fn namelookup_time_t(easy: &mut Easy) -> Result<Duration, Error> {
getopt_off_t(easy, CURLINFO_NAMELOOKUP_TIME_T).map(microseconds_to_duration)
}
@ -117,7 +117,7 @@ pub fn namelookup_time_t(easy: &Easy) -> Result<Duration, Error> {
///
/// Corresponds to [`CURLINFO_CONNECT_TIME_T`] and may return an error if the
/// option isn't supported.
pub fn connect_time_t(easy: &Easy) -> Result<Duration, Error> {
pub fn connect_time_t(easy: &mut Easy) -> Result<Duration, Error> {
getopt_off_t(easy, CURLINFO_CONNECT_TIME_T).map(microseconds_to_duration)
}
@ -131,7 +131,7 @@ pub fn connect_time_t(easy: &Easy) -> Result<Duration, Error> {
///
/// Corresponds to [`CURLINFO_APPCONNECT_TIME_T`] and may return an error if the
/// option isn't supported.
pub fn appconnect_time_t(easy: &Easy) -> Result<Duration, Error> {
pub fn appconnect_time_t(easy: &mut Easy) -> Result<Duration, Error> {
getopt_off_t(easy, CURLINFO_APPCONNECT_TIME_T).map(microseconds_to_duration)
}
@ -145,7 +145,7 @@ pub fn appconnect_time_t(easy: &Easy) -> Result<Duration, Error> {
///
/// Corresponds to [`CURLINFO_PRETRANSFER_TIME`] and may return an error if the
/// option isn't supported.
pub fn pretransfer_time_t(easy: &Easy) -> Result<Duration, Error> {
pub fn pretransfer_time_t(easy: &mut Easy) -> Result<Duration, Error> {
getopt_off_t(easy, CURLINFO_PRETRANSFER_TIME_T).map(microseconds_to_duration)
}
@ -157,7 +157,7 @@ pub fn pretransfer_time_t(easy: &Easy) -> Result<Duration, Error> {
///
/// Corresponds to [`CURLINFO_STARTTRANSFER_TIME`] and may return an error if the
/// option isn't supported.
pub fn starttransfer_time_t(easy: &Easy) -> Result<Duration, Error> {
pub fn starttransfer_time_t(easy: &mut Easy) -> Result<Duration, Error> {
getopt_off_t(easy, CURLINFO_STARTTRANSFER_TIME_T).map(microseconds_to_duration)
}
@ -168,7 +168,7 @@ pub fn starttransfer_time_t(easy: &Easy) -> Result<Duration, Error> {
///
/// Corresponds to [`CURLINFO_TOTAL_TIME_T`] and may return an error if the
/// option isn't supported.
pub fn total_time_t(easy: &Easy) -> Result<Duration, Error> {
pub fn total_time_t(easy: &mut Easy) -> Result<Duration, Error> {
getopt_off_t(easy, CURLINFO_TOTAL_TIME_T).map(microseconds_to_duration)
}
@ -202,7 +202,7 @@ fn cvt(easy: &Easy, rc: curl_sys::CURLcode) -> Result<(), Error> {
Err(err)
}
fn getopt_off_t(easy: &Easy, opt: CURLINFO) -> Result<curl_off_t, Error> {
fn getopt_off_t(easy: &mut Easy, opt: CURLINFO) -> Result<curl_off_t, Error> {
unsafe {
let mut p = 0 as curl_off_t;
let rc = curl_sys::curl_easy_getinfo(easy.raw(), opt, &mut p);

View File

@ -33,29 +33,42 @@ pub struct Timings {
pub name_lookup: Duration,
pub connect: Duration,
pub app_connect: Duration,
pub pre_transfert: Duration,
pub start_transfert: Duration,
pub pre_transfer: Duration,
pub start_transfer: Duration,
pub total: Duration,
}
impl Timings {
pub fn new(easy: &Easy, begin_call: DateTime<Utc>, end_call: DateTime<Utc>) -> Self {
// TODO: maybe implement fallback to *_time function in case *_time_t are
// not implemented.
let name_lookup = easy_ext::namelookup_time_t(easy).unwrap_or(Duration::default());
let connect = easy_ext::connect_time_t(easy).unwrap_or(Duration::default());
let app_connect = easy_ext::appconnect_time_t(easy).unwrap_or(Duration::default());
let pre_transfert = easy_ext::pretransfer_time_t(easy).unwrap_or(Duration::default());
let start_transfert = easy_ext::starttransfer_time_t(easy).unwrap_or(Duration::default());
let total = easy_ext::total_time_t(easy).unwrap_or(Duration::default());
pub fn new(easy: &mut Easy, begin_call: DateTime<Utc>, end_call: DateTime<Utc>) -> Self {
// We try the *_t timing function of libcurl (available for libcurl >= 7.61.0)
// returning timing in nanoseconds, or fallback to timing function returning seconds
// if *_t are not available.
let name_lookup = easy_ext::namelookup_time_t(easy)
.or(easy.namelookup_time())
.unwrap_or(Duration::default());
let connect = easy_ext::connect_time_t(easy)
.or(easy.connect_time())
.unwrap_or(Duration::default());
let app_connect = easy_ext::appconnect_time_t(easy)
.or(easy.appconnect_time())
.unwrap_or(Duration::default());
let pre_transfer = easy_ext::pretransfer_time_t(easy)
.or(easy.pretransfer_time())
.unwrap_or(Duration::default());
let start_transfer = easy_ext::starttransfer_time_t(easy)
.or(easy.starttransfer_time())
.unwrap_or(Duration::default());
let total = easy_ext::total_time_t(easy)
.or(easy.total_time())
.unwrap_or(Duration::default());
Timings {
begin_call,
end_call,
name_lookup,
connect,
app_connect,
pre_transfert,
start_transfert,
pre_transfer,
start_transfer,
total,
}
}

View File

@ -292,12 +292,12 @@ impl Timings {
"app_connect".to_string(),
serde_json::Value::Number(Number::from(value)),
);
let value = self.pre_transfert.as_micros() as u64;
let value = self.pre_transfer.as_micros() as u64;
map.insert(
"pre_transfert".to_string(),
serde_json::Value::Number(Number::from(value)),
);
let value = self.start_transfert.as_micros() as u64;
let value = self.start_transfer.as_micros() as u64;
map.insert(
"start_transfert".to_string(),
serde_json::Value::Number(Number::from(value)),