mirror of
https://github.com/Orange-OpenSource/hurl.git
synced 2024-09-21 18:57:33 +03:00
Add timing info for libcurl < 7.61 (using second function timings).
This commit is contained in:
parent
e4a373266b
commit
749ba0eca2
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
@ -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)),
|
||||
|
Loading…
Reference in New Issue
Block a user