1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
#!/bin/sh
test_description='test git-http-backend respects CONTENT_LENGTH'
. ./test-lib.sh
if ! test_have_prereq PERL_TEST_HELPERS
then
skip_all='skipping http backend content tests; Perl not available'
test_done
fi
test_lazy_prereq GZIP 'gzip --version'
verify_http_result() {
# some fatal errors still produce status 200
# so check if there is the error message
if grep 'fatal:' act.err.$test_count
then
return 1
fi
if ! grep "Status" act.out.$test_count >act
then
printf "Status: 200 OK\r\n" >act
fi
printf "Status: $1\r\n" >exp &&
test_cmp exp act
}
test_http_env() {
handler_type="$1"
request_body="$2"
shift
env \
CONTENT_TYPE="application/x-git-$handler_type-pack-request" \
QUERY_STRING="/repo.git/git-$handler_type-pack" \
PATH_TRANSLATED="$PWD/.git/git-$handler_type-pack" \
GIT_HTTP_EXPORT_ALL=TRUE \
REQUEST_METHOD=POST \
"$PERL_PATH" \
"$TEST_DIRECTORY"/t5562/invoke-with-content-length.pl \
"$request_body" git http-backend >act.out.$test_count 2>act.err.$test_count
}
ssize_b100dots() {
# hardcoded ((size_t) SSIZE_MAX) + 1
case "$(build_option sizeof-size_t)" in
8) echo 9223372036854775808;;
4) echo 2147483648;;
*) die "Unexpected ssize_t size: $(build_option sizeof-size_t)";;
esac
}
test_expect_success 'setup' '
HTTP_CONTENT_ENCODING="identity" &&
export HTTP_CONTENT_ENCODING &&
git config http.receivepack true &&
test_commit c0 &&
test_commit c1 &&
hash_head=$(git rev-parse HEAD) &&
hash_prev=$(git rev-parse HEAD~1) &&
{
packetize "want $hash_head" &&
printf 0000 &&
packetize "have $hash_prev" &&
packetize "done"
} >fetch_body &&
test_copy_bytes 10 <fetch_body >fetch_body.trunc &&
hash_next=$(git commit-tree -p HEAD -m next HEAD^{tree}) &&
{
printf "%s %s refs/heads/newbranch\\0report-status object-format=%s\\n" \
"$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize_raw &&
printf 0000 &&
echo "$hash_next" | git pack-objects --stdout
} >push_body &&
test_copy_bytes 10 <push_body >push_body.trunc &&
: >empty_body
'
test_expect_success GZIP 'setup, compression related' '
gzip -c fetch_body >fetch_body.gz &&
test_copy_bytes 10 <fetch_body.gz >fetch_body.gz.trunc &&
gzip -c push_body >push_body.gz &&
test_copy_bytes 10 <push_body.gz >push_body.gz.trunc
'
test_expect_success 'fetch plain' '
test_http_env upload fetch_body &&
verify_http_result "200 OK"
'
test_expect_success 'fetch plain truncated' '
test_http_env upload fetch_body.trunc &&
! verify_http_result "200 OK"
'
test_expect_success 'fetch plain empty' '
test_http_env upload empty_body &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'fetch gzipped' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env upload fetch_body.gz &&
verify_http_result "200 OK"
'
test_expect_success GZIP 'fetch gzipped truncated' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env upload fetch_body.gz.trunc &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'fetch gzipped empty' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env upload empty_body &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'push plain' '
test_when_finished "git branch -D newbranch" &&
test_http_env receive push_body &&
verify_http_result "200 OK" &&
git rev-parse newbranch >act.head &&
echo "$hash_next" >exp.head &&
test_cmp act.head exp.head
'
test_expect_success 'push plain truncated' '
test_http_env receive push_body.trunc &&
! verify_http_result "200 OK"
'
test_expect_success 'push plain empty' '
test_http_env receive empty_body &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'push gzipped' '
test_when_finished "git branch -D newbranch" &&
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env receive push_body.gz &&
verify_http_result "200 OK" &&
git rev-parse newbranch >act.head &&
echo "$hash_next" >exp.head &&
test_cmp act.head exp.head
'
test_expect_success GZIP 'push gzipped truncated' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env receive push_body.gz.trunc &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'push gzipped empty' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env receive empty_body &&
! verify_http_result "200 OK"
'
test_expect_success 'CONTENT_LENGTH overflow ssite_t' '
NOT_FIT_IN_SSIZE=$(ssize_b100dots) &&
env \
CONTENT_TYPE=application/x-git-upload-pack-request \
QUERY_STRING=/repo.git/git-upload-pack \
PATH_TRANSLATED="$PWD"/.git/git-upload-pack \
GIT_HTTP_EXPORT_ALL=TRUE \
REQUEST_METHOD=POST \
CONTENT_LENGTH="$NOT_FIT_IN_SSIZE" \
git http-backend </dev/null >/dev/null 2>err &&
grep "fatal:.*CONTENT_LENGTH" err
'
test_expect_success 'empty CONTENT_LENGTH' '
env \
QUERY_STRING="service=git-receive-pack" \
PATH_TRANSLATED="$PWD"/.git/info/refs \
GIT_HTTP_EXPORT_ALL=TRUE \
REQUEST_METHOD=GET \
CONTENT_LENGTH="" \
git http-backend <empty_body >act.out.$test_count 2>act.err.$test_count &&
verify_http_result "200 OK"
'
test_done
|