diff options
author | Stefan Eissing <stefan@eissing.org> | 2023-03-03 17:54:44 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2023-03-06 20:16:43 +0100 |
commit | 257416023d179f84ab77a53406156871453e280f (patch) | |
tree | c1b6d86917538d3e45d7f689aa7e2bfa06456940 /lib/cfilters.c | |
parent | 93eefa6ba134aceef4f6cd51fc602319b382e629 (diff) | |
download | curl-257416023d179f84ab77a53406156871453e280f.tar.gz |
connect: fix time_connect and time_appconnect timer statistics
- time_connect was not updated when the overall connection failed,
e.g. when SSL verification was unsuccessful, refs #10670
- rework gather those values to interrogate involved filters,
also from all eyeballing attempts, to report the maximum of
those values.
- added 3 test cases in test_06 to check reported values on
successful, partially failed and totally failed connections.
Reported-by: Master Inspire
Fixes #10670
Closes #10671
Diffstat (limited to 'lib/cfilters.c')
-rw-r--r-- | lib/cfilters.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/lib/cfilters.c b/lib/cfilters.c index 2af0dd828..c9932afcd 100644 --- a/lib/cfilters.c +++ b/lib/cfilters.c @@ -370,9 +370,12 @@ CURLcode Curl_conn_connect(struct Curl_easy *data, result = cf->cft->connect(cf, data, blocking, done); if(!result && *done) { Curl_conn_ev_update_info(data, data->conn); - Curl_conn_ev_report_stats(data, data->conn); + Curl_conn_report_connect_stats(data, data->conn); data->conn->keepalive = Curl_now(); } + else if(result) { + Curl_conn_report_connect_stats(data, data->conn); + } } return result; @@ -608,10 +611,24 @@ void Curl_conn_ev_update_info(struct Curl_easy *data, cf_cntrl_all(conn, data, TRUE, CF_CTRL_CONN_INFO_UPDATE, 0, NULL); } -void Curl_conn_ev_report_stats(struct Curl_easy *data, - struct connectdata *conn) +void Curl_conn_report_connect_stats(struct Curl_easy *data, + struct connectdata *conn) { - cf_cntrl_all(conn, data, TRUE, CF_CTRL_CONN_REPORT_STATS, 0, NULL); + struct Curl_cfilter *cf = conn->cfilter[FIRSTSOCKET]; + if(cf) { + struct curltime connected; + struct curltime appconnected; + + memset(&connected, 0, sizeof(connected)); + cf->cft->query(cf, data, CF_QUERY_TIMER_CONNECT, NULL, &connected); + if(connected.tv_sec || connected.tv_usec) + Curl_pgrsTimeWas(data, TIMER_CONNECT, connected); + + memset(&appconnected, 0, sizeof(appconnected)); + cf->cft->query(cf, data, CF_QUERY_TIMER_APPCONNECT, NULL, &appconnected); + if(appconnected.tv_sec || appconnected.tv_usec) + Curl_pgrsTimeWas(data, TIMER_APPCONNECT, appconnected); + } } bool Curl_conn_is_alive(struct Curl_easy *data, struct connectdata *conn) |