Files
git-mirror/t/t5564-http-proxy.sh
brian m. carlson a92f243a94 t5564: fix test hang under zsh's sh mode
This test starts a SOCKS server in Perl in the background and then kills
it after the tests are done.  However, when using zsh (in sh mode) in
the tests, the start_socks function hangs until the background process
is killed.

Note that this does not reproduce in a simple shell script, so there is
likely some interaction between job handling, our heavy use of eval in
the test framework, and possibly other complexities of our test
framework.  What is clear, however, is that switching from a compound
statement to a subshell fixes the problem entirely and the test passes
with no problem, so do that.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-11-27 19:06:03 -08:00

99 lines
2.9 KiB
Bash
Executable File

#!/bin/sh
test_description="test fetching through http proxy"
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-httpd.sh
LIB_HTTPD_PROXY=1
start_httpd
test_expect_success 'setup repository' '
test_commit foo &&
git init --bare "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
git push --mirror "$HTTPD_DOCUMENT_ROOT_PATH/repo.git"
'
setup_askpass_helper
# sanity check that our test setup is correctly using proxy
test_expect_success 'proxy requires password' '
test_config_global http.proxy $HTTPD_DEST &&
test_must_fail git clone $HTTPD_URL/smart/repo.git 2>err &&
grep "error.*407" err
'
test_expect_success 'clone through proxy with auth' '
test_when_finished "rm -rf clone" &&
test_config_global http.proxy http://proxuser:proxpass@$HTTPD_DEST &&
GIT_TRACE_CURL=$PWD/trace git clone $HTTPD_URL/smart/repo.git clone &&
grep -i "Proxy-Authorization: Basic <redacted>" trace
'
test_expect_success 'clone can prompt for proxy password' '
test_when_finished "rm -rf clone" &&
test_config_global http.proxy http://proxuser@$HTTPD_DEST &&
set_askpass nobody proxpass &&
GIT_TRACE_CURL=$PWD/trace git clone $HTTPD_URL/smart/repo.git clone &&
expect_askpass pass proxuser
'
start_socks() {
mkfifo socks_output &&
(
"$PERL_PATH" "$TEST_DIRECTORY/socks4-proxy.pl" "$1" >socks_output &
echo $! > "$TRASH_DIRECTORY/socks.pid"
) &&
read line <socks_output &&
test "$line" = ready
}
# The %30 tests that the correct amount of percent-encoding is applied to the
# proxy string passed to curl.
test_lazy_prereq SOCKS_PROXY '
test_have_prereq PERL &&
start_socks "$TRASH_DIRECTORY/%30.sock"
'
test_atexit '
test ! -e "$TRASH_DIRECTORY/socks.pid" ||
kill "$(cat "$TRASH_DIRECTORY/socks.pid")"
'
# The below tests morally ought to be gated on a prerequisite that Git is
# linked with a libcurl that supports Unix socket paths for proxies (7.84 or
# later), but this is not easy to test right now. Instead, we || the tests with
# this function.
old_libcurl_error() {
grep -Fx "fatal: libcurl 7.84 or later is required to support paths in proxy URLs" "$1"
}
test_expect_success SOCKS_PROXY 'clone via Unix socket' '
test_when_finished "rm -rf clone" &&
test_config_global http.proxy "socks4://localhost$PWD/%2530.sock" && {
{
GIT_TRACE_CURL=$PWD/trace \
GIT_TRACE_CURL_COMPONENTS=socks \
git clone "$HTTPD_URL/smart/repo.git" clone 2>err &&
grep -i "SOCKS4 request granted" trace
} ||
old_libcurl_error err
}
'
test_expect_success 'Unix socket requires socks*:' - <<\EOT
! git clone -c http.proxy=localhost/path https://example.com/repo.git 2>err && {
grep -Fx "fatal: Invalid proxy URL 'localhost/path': only SOCKS proxies support paths" err ||
old_libcurl_error err
}
EOT
test_expect_success 'Unix socket requires localhost' - <<\EOT
! git clone -c http.proxy=socks4://127.0.0.1/path https://example.com/repo.git 2>err && {
grep -Fx "fatal: Invalid proxy URL 'socks4://127.0.0.1/path': host must be localhost if a path is present" err ||
old_libcurl_error err
}
EOT
test_done