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,