]>
Commit | Line | Data |
---|---|---|
6c213e86 MK |
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 |