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