From: Stefan Eissing Date: Wed, 8 Apr 2026 12:37:45 +0000 (+0200) Subject: cfilters: CF_TYPE_SETUP connection filter X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ef49d42a2c219679aa6844dffd899169ffbdafa1;p=thirdparty%2Fcurl.git cfilters: CF_TYPE_SETUP connection filter Connection filters can now carry the flag CF_TYPE_SETUP, indicating that they are only needed during connection setup, e.g. connect. Once the connection is fully established, those filter are removed again. This frees resources and also makes the filter (call) chains shorter. Closes #21269 --- diff --git a/lib/cf-dns.c b/lib/cf-dns.c index 437a3491c3..c9df2ff93f 100644 --- a/lib/cf-dns.c +++ b/lib/cf-dns.c @@ -306,7 +306,7 @@ static CURLcode cf_dns_cntrl(struct Curl_cfilter *cf, struct Curl_cftype Curl_cft_dns = { "DNS", - 0, + CF_TYPE_SETUP, CURL_LOG_LVL_NONE, cf_dns_destroy, cf_dns_connect, diff --git a/lib/cf-haproxy.c b/lib/cf-haproxy.c index 782253e83e..46d0541055 100644 --- a/lib/cf-haproxy.c +++ b/lib/cf-haproxy.c @@ -185,7 +185,7 @@ static CURLcode cf_haproxy_adjust_pollset(struct Curl_cfilter *cf, struct Curl_cftype Curl_cft_haproxy = { "HAPROXY", - CF_TYPE_PROXY, + CF_TYPE_PROXY | CF_TYPE_SETUP, 0, cf_haproxy_destroy, cf_haproxy_connect, diff --git a/lib/cf-https-connect.c b/lib/cf-https-connect.c index b07631ac40..5434cd7ed6 100644 --- a/lib/cf-https-connect.c +++ b/lib/cf-https-connect.c @@ -743,7 +743,7 @@ static void cf_hc_destroy(struct Curl_cfilter *cf, struct Curl_easy *data) struct Curl_cftype Curl_cft_http_connect = { "HTTPS-CONNECT", - 0, + CF_TYPE_SETUP, CURL_LOG_LVL_NONE, cf_hc_destroy, cf_hc_connect, diff --git a/lib/cf-ip-happy.c b/lib/cf-ip-happy.c index 0659f56aed..2558053b47 100644 --- a/lib/cf-ip-happy.c +++ b/lib/cf-ip-happy.c @@ -958,7 +958,7 @@ static void cf_ip_happy_destroy(struct Curl_cfilter *cf, struct Curl_cftype Curl_cft_ip_happy = { "HAPPY-EYEBALLS", - 0, + CF_TYPE_SETUP, CURL_LOG_LVL_NONE, cf_ip_happy_destroy, cf_ip_happy_connect, diff --git a/lib/cfilters.c b/lib/cfilters.c index 41e09bc9fc..2f8fd4a6b0 100644 --- a/lib/cfilters.c +++ b/lib/cfilters.c @@ -491,6 +491,24 @@ static void conn_report_connect_stats(struct Curl_cfilter *cf, } } +static void conn_remove_setup_filters(struct Curl_easy *data, + int sockindex) +{ + struct Curl_cfilter **anchor = &data->conn->cfilter[sockindex]; + while(*anchor) { + struct Curl_cfilter *cf = *anchor; + if(cf->connected && (cf->cft->flags & CF_TYPE_SETUP)) { + *anchor = cf->next; + cf->next = NULL; + CURL_TRC_CF(data, cf, "removing connected setup filter"); + cf->cft->destroy(cf, data); + curlx_free(cf); + } + else + anchor = &cf->next; + } +} + CURLcode Curl_conn_connect(struct Curl_easy *data, int sockindex, bool blocking, @@ -544,6 +562,7 @@ CURLcode Curl_conn_connect(struct Curl_easy *data, conn_report_connect_stats(cf, data); data->conn->keepalive = *Curl_pgrs_now(data); VERBOSE(result = cf_verboseconnect(data, cf)); + conn_remove_setup_filters(data, sockindex); goto out; } else if(result) { diff --git a/lib/cfilters.h b/lib/cfilters.h index 77405b51ad..38311b24b8 100644 --- a/lib/cfilters.h +++ b/lib/cfilters.h @@ -199,12 +199,15 @@ typedef CURLcode Curl_cft_query(struct Curl_cfilter *cf, * CF_TYPE_MULTIPLEX: provides multiplexing of easy handles * CF_TYPE_PROXY provides proxying * CF_TYPE_HTTP implement a version of the HTTP protocol + * CF_TYPE_SETUP filter is only needed for connection setup and + * can be removed once connected */ #define CF_TYPE_IP_CONNECT (1 << 0) #define CF_TYPE_SSL (1 << 1) #define CF_TYPE_MULTIPLEX (1 << 2) #define CF_TYPE_PROXY (1 << 3) #define CF_TYPE_HTTP (1 << 4) +#define CF_TYPE_SETUP (1 << 5) /* A connection filter type, e.g. specific implementation. */ struct Curl_cftype { diff --git a/lib/http_proxy.c b/lib/http_proxy.c index 5996c12f4e..4bdfe22240 100644 --- a/lib/http_proxy.c +++ b/lib/http_proxy.c @@ -391,7 +391,7 @@ static void http_proxy_cf_close(struct Curl_cfilter *cf, struct Curl_cftype Curl_cft_http_proxy = { "HTTP-PROXY", - CF_TYPE_IP_CONNECT | CF_TYPE_PROXY, + CF_TYPE_IP_CONNECT | CF_TYPE_PROXY | CF_TYPE_SETUP, 0, http_proxy_cf_destroy, http_proxy_cf_connect,