diff --git a/src/future/http/HTTPSFuture.php b/src/future/http/HTTPSFuture.php --- a/src/future/http/HTTPSFuture.php +++ b/src/future/http/HTTPSFuture.php @@ -420,7 +420,9 @@ // NOTE: We want to use keepalive if possible. Return the handle to a // pool for the domain; don't close it. - self::$pool[$domain][] = $curl; + if ($this->shouldReuseHandles()) { + self::$pool[$domain][] = $curl; + } $profiler = PhutilServiceProfiler::getInstance(); $profiler->endServiceCall($this->profilerCallID, array()); @@ -666,5 +668,19 @@ return $bytes; } + private function shouldReuseHandles() { + $curl_version = curl_version(); + $version = idx($curl_version, 'version'); + + // NOTE: cURL 7.43.0 has a bug where the POST body length is not recomputed + // properly when a handle is reused. For this version of cURL, disable + // handle reuse and accept a small performance penalty. See T8654. + if ($version == '7.43.0') { + return false; + } + + return true; + } + }