remote-curl: add Transfer-Encoding header only for older curl
commit92a209bf245c6497f3742b9df7a1463ddf067ea6
authorJeff King <peff@peff.net>
Fri, 5 Apr 2024 20:04:51 +0000 (5 16:04 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Apr 2024 21:45:19 +0000 (5 14:45 -0700)
tree3b27c1232dde5c6d6954d5baed5b6f318b0f3853
parentc28ee09503ffcb1f32cbb30dc57fa810cdac122c
remote-curl: add Transfer-Encoding header only for older curl

As of curl 7.66.0, we don't need to manually specify a "chunked"
Transfer-Encoding header. Instead, modern curl deduces the need for it
in a POST that has a POSTFIELDSIZE of -1 and uses READFUNCTION rather
than POSTFIELDS.

That version is recent enough that we can't just drop the header; we
need to do so conditionally. Since it's only a single line, it seems
like the simplest thing would just be to keep setting it unconditionally
(after all, the #ifdefs are much longer than the actual code). But
there's another wrinkle: HTTP/2.

Curl may choose to use HTTP/2 under the hood if the server supports it.
And in that protocol, we do not use the chunked encoding for streaming
at all. Most versions of curl handle this just fine by recognizing and
removing the header. But there's a regression in curl 8.7.0 and 8.7.1
where it doesn't, and large requests over HTTP/2 are broken (which t5559
notices). That regression has since been fixed upstream, but not yet
released.

Make the setting of this header conditional, which will let Git work
even with those buggy curl versions. And as a bonus, it serves as a
reminder that we can eventually clean up the code as we bump the
supported curl versions.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-curl-compat.h
remote-curl.c