summaryrefslogtreecommitdiff
path: root/lib/cfilters.c
diff options
context:
space:
mode:
authorStefan Eissing <stefan@eissing.org>2023-03-03 17:54:44 +0100
committerDaniel Stenberg <daniel@haxx.se>2023-03-06 20:16:43 +0100
commit257416023d179f84ab77a53406156871453e280f (patch)
treec1b6d86917538d3e45d7f689aa7e2bfa06456940 /lib/cfilters.c
parent93eefa6ba134aceef4f6cd51fc602319b382e629 (diff)
downloadcurl-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.c25
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)