From: Fata Nugraha Date: Wed, 9 Nov 2022 09:38:00 +0000 (+0700) Subject: http: do not send PROXY more than once X-Git-Tag: curl-7_87_0~179 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11ad25fff4b62f3fddfd3f633a114027fb4e99a2;p=thirdparty%2Fcurl.git http: do not send PROXY more than once Unlike `CONNECT`, currently we don't keep track whether `PROXY` is already sent or not. This causes `PROXY` header to be sent twice during `MSTATE_TUNNELING` and `MSTATE_PROTOCONNECT`. Closes #9878 Fixes #9442 --- diff --git a/lib/http.c b/lib/http.c index f5ccda8f67..90e6df19c0 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1572,11 +1572,14 @@ CURLcode Curl_http_connect(struct Curl_easy *data, bool *done) /* nothing else to do except wait right now - we're not done here. */ return CURLE_OK; - if(data->set.haproxyprotocol) { + if(data->set.haproxyprotocol && !data->state.is_haproxy_hdr_sent) { /* add HAProxy PROXY protocol header */ result = add_haproxy_protocol_header(data); if(result) return result; + + /* do not send the header again after successful try */ + data->state.is_haproxy_hdr_sent = TRUE; } #endif diff --git a/lib/urldata.h b/lib/urldata.h index 1ae7aa4a5e..7f1acc4c5a 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1461,6 +1461,10 @@ struct UrlState { trailers_state trailers_state; /* whether we are sending trailers and what stage are we at */ #endif +#ifndef CURL_DISABLE_PROXY + /* to keep track whether we already sent PROXY header or not */ + BIT(is_haproxy_hdr_sent); +#endif #ifdef USE_HYPER bool hconnect; /* set if a CONNECT request */ CURLcode hresult; /* used to pass return codes back from hyper callbacks */