http-backend: allow empty CONTENT_LENGTH

According to RFC3875, empty environment variable is equivalent to unset, and for CONTENT_LENGTH it should mean zero body to read. However, unset CONTENT_LENGTH is also used for chunked encoding to indicate reading until EOF. At least, the test "large fetch-pack requests can be split across POSTs" from t5551 starts faliing, if unset or empty CONTENT_LENGTH is treated as zero length body. So keep the existing behavior as much as possible. Add a test for the case. Reported-By: Jelmer Vernooij <jelmer@jelmer.uk> Signed-off-by: Max Kirillov <max@max630.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Max Kirillov committed Sep 7, 2018 at 06:36 UTC 574c513e8dda5598e9e08e8ca2a048bf120a5709
2 files changed +12 -1
http-backend.c
+1 -1
@@ -353,7 +353,7 @@ static ssize_t get_content_length(void)
353 ssize_t val = -1;
354 const char *str = getenv("CONTENT_LENGTH");
355
356 - if (str && !git_parse_ssize_t(str, &val))
356 + if (str && *str && !git_parse_ssize_t(str, &val))
357 die("failed to parse CONTENT_LENGTH: %s", str);
358 return val;
359 }
t/t5562-http-backend-content-length.sh
+11
@@ -153,4 +153,15 @@ test_expect_success 'CONTENT_LENGTH overflow ssite_t' '
153 grep "fatal:.*CONTENT_LENGTH" err
154 '
155
156 +test_expect_success 'empty CONTENT_LENGTH' '
157 + env \
158 + QUERY_STRING=/repo.git/HEAD \
159 + PATH_TRANSLATED="$PWD"/.git/HEAD \
160 + GIT_HTTP_EXPORT_ALL=TRUE \
161 + REQUEST_METHOD=GET \
162 + CONTENT_LENGTH="" \
163 + git http-backend <empty_body >act.out 2>act.err &&
164 + verify_http_result "200 OK"
165 +'
166 +
167 test_done