unix-sockets: ignore proxy settings

Fix a recent regression: when a unix-socket is configured, all proxy
settings must be ignored. The `via_peer` had been checked correctly,
but the connections proxy bits were not cleared.

Add test_11_04 to verify.

Reported-by: Fabian Keil (libcurl mailing list)
Closes #21630
This commit is contained in:
Stefan Eissing 2026-05-15 14:11:13 +02:00 committed by Daniel Stenberg
parent 535c575e31
commit ad549c4641
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
3 changed files with 22 additions and 6 deletions

View file

@ -2627,10 +2627,13 @@ static CURLcode url_create_needle(struct Curl_easy *data,
}
#ifndef CURL_DISABLE_PROXY
/* After the Unix socket init but before the proxy vars are used, parse and
* initialize the proxy settings.
* Any UDS `via_peer` disables proxies. */
if(network_scheme && !(needle->via_peer && needle->via_peer->unix_socket)) {
/* Going via a unix socket ignores any proxy settings */
if(needle->via_peer && needle->via_peer->unix_socket) {
needle->bits.socksproxy = FALSE;
needle->bits.httpproxy = FALSE;
needle->bits.proxy = FALSE;
}
else if(network_scheme) {
result = url_set_conn_proxies(data, needle);
if(result)
goto out;

View file

@ -452,8 +452,8 @@ struct connectdata {
#ifndef CURL_DISABLE_PROXY
#define CURL_CONN_HOST_DISPNAME(c) \
((c)->bits.socksproxy ? (c)->socks_proxy.peer->user_hostname : \
(c)->bits.httpproxy ? (c)->http_proxy.peer->user_hostname : \
((c)->socks_proxy.peer ? (c)->socks_proxy.peer->user_hostname : \
(c)->http_proxy.peer ? (c)->http_proxy.peer->user_hostname : \
(c)->via_peer ? (c)->via_peer->user_hostname : \
(c)->origin->user_hostname)
#else

View file

@ -136,3 +136,16 @@ class TestUnix:
r.check_response(exitcode=96, http_status=None)
assert r.stats[0]['remote_port'] == -1, f'{r.dump_logs()}'
assert r.stats[0]['local_port'] == -1, f'{r.dump_logs()}'
# download http: via Unix socket, ignore proxy args
def test_11_04_unix_connect_http(self, env: Env, httpd, uds_faker):
curl = CurlClient(env=env)
url = f'http://{env.domain1}:{env.http_port}/data.json'
xargs = curl.get_proxy_args(proto='http/1.1', use_ip=True, proxys=False)
xargs.extend([
'--unix-socket', uds_faker.path,
])
r = curl.http_download(urls=[url], with_stats=True, extra_args=xargs)
r.check_response(count=1, http_status=200)
assert r.stats[0]['remote_port'] == -1, f'{r.dump_logs()}'
assert r.stats[0]['local_port'] == -1, f'{r.dump_logs()}'