Raw
1 #!/bin/sh
2
3 test_description="test fetching through http proxy"
4
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY"/lib-httpd.sh
7
8 LIB_HTTPD_PROXY=1
9 start_httpd
10
11 test_expect_success 'setup repository' '
12 test_commit foo &&
13 git init --bare "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
14 git push --mirror "$HTTPD_DOCUMENT_ROOT_PATH/repo.git"
15 '
16
17 setup_askpass_helper
18
19 # sanity check that our test setup is correctly using proxy
20 test_expect_success 'proxy requires password' '
21 test_config_global http.proxy $HTTPD_DEST &&
22 test_must_fail git clone $HTTPD_URL/smart/repo.git 2>err &&
23 test_grep "error.*407" err
24 '
25
26 test_expect_success 'clone through proxy with auth' '
27 test_when_finished "rm -rf clone" &&
28 test_config_global http.proxy http://proxuser:proxpass@$HTTPD_DEST &&
29 GIT_TRACE_CURL=$PWD/trace git clone $HTTPD_URL/smart/repo.git clone &&
30 test_grep -i "Proxy-Authorization: Basic <redacted>" trace
31 '
32
33 test_expect_success 'clone can prompt for proxy password' '
34 test_when_finished "rm -rf clone" &&
35 test_config_global http.proxy http://proxuser@$HTTPD_DEST &&
36 set_askpass nobody proxpass &&
37 GIT_TRACE_CURL=$PWD/trace git clone $HTTPD_URL/smart/repo.git clone &&
38 expect_askpass pass proxuser
39 '
40
41 start_socks() {
42 mkfifo socks_output &&
43 (
44 "$PERL_PATH" "$TEST_DIRECTORY/socks4-proxy.pl" "$1" >socks_output &
45 echo $! > "$TRASH_DIRECTORY/socks.pid"
46 ) &&
47 read line <socks_output &&
48 test "$line" = ready
49 }
50
51 # The %30 tests that the correct amount of percent-encoding is applied to the
52 # proxy string passed to curl.
53 # Use a short path for the socket to avoid exceeding the 108-character
54 # Unix domain socket limit when the trash directory path is long.
55 SOCKS_TMPDIR=$(mktemp -d)
56 SOCKS_SOCK="$SOCKS_TMPDIR/%30.sock"
57
58 test_lazy_prereq SOCKS_PROXY '
59 test_have_prereq PERL &&
60 start_socks "$SOCKS_SOCK"
61 '
62
63 test_atexit '
64 test ! -e "$TRASH_DIRECTORY/socks.pid" ||
65 kill "$(cat "$TRASH_DIRECTORY/socks.pid")"
66 rm -rf "$SOCKS_TMPDIR"
67 '
68
69 # The below tests morally ought to be gated on a prerequisite that Git is
70 # linked with a libcurl that supports Unix socket paths for proxies (7.84 or
71 # later), but this is not easy to test right now. Instead, we || the tests with
72 # this function.
73 old_libcurl_error() {
74 grep -Fx "fatal: libcurl 7.84 or later is required to support paths in proxy URLs" "$1"
75 }
76
77 test_expect_success SOCKS_PROXY 'clone via Unix socket' '
78 test_when_finished "rm -rf clone" &&
79 socks_proxy_url="socks4://localhost$(echo "$SOCKS_SOCK" | sed "s/%/%25/g")" &&
80 test_config_global http.proxy "$socks_proxy_url" && {
81 {
82 GIT_TRACE_CURL=$PWD/trace \
83 GIT_TRACE_CURL_COMPONENTS=socks \
84 git clone "$HTTPD_URL/smart/repo.git" clone 2>err &&
85 test_grep -i "SOCKS4 request granted" trace
86 } ||
87 old_libcurl_error err
88 }
89 '
90
91 test_expect_success 'Unix socket requires socks*:' - <<\EOT
92 ! git clone -c http.proxy=localhost/path https://example.com/repo.git 2>err && {
93 test_grep -Fx "fatal: Invalid proxy URL 'localhost/path': only SOCKS proxies support paths" err ||
94 old_libcurl_error err
95 }
96 EOT
97
98 test_expect_success 'Unix socket requires localhost' - <<\EOT
99 ! git clone -c http.proxy=socks4://127.0.0.1/path https://example.com/repo.git 2>err && {
100 test_grep -Fx "fatal: Invalid proxy URL 'socks4://127.0.0.1/path': host must be localhost if a path is present" err ||
101 old_libcurl_error err
102 }
103 EOT
104
105 test_expect_success 'unknown proxy scheme is rejected' '
106 test_must_fail git clone -c http.proxy=htpp://127.0.0.1 \
107 https://example.com/repo.git 2>err &&
108 test_grep "unsupported proxy scheme '\''htpp'\''" err
109 '
110
111 test_done