1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-15 03:48:02 +08:00

curl: Avoid using HTTP/2 with curl 8.7.x due to bug in error codes

curl 8.7.x has a bug in HTTP/2 error codes introduced by
commit `0dc036225` (HTTP/2: write response directly, 2024-01-31,
`curl-8_7_0~230`) and fixed by commit `5c59f9142` (http2 + ngtcp2:
pass CURLcode errors from callbacks, 2024-04-18, `curl-8_8_0~181`).

Fixes: #26200
This commit is contained in:
Brad King
2024-08-13 15:06:14 -04:00
parent d88682dff6
commit 7486f468fb
5 changed files with 18 additions and 4 deletions

View File

@@ -22,7 +22,7 @@ cmCTestCurl::cmCTestCurl(cmCTest* ctest)
cmCurlInitOnce();
// In windows, this will init the winsock stuff
::curl_global_init(CURL_GLOBAL_ALL);
this->Curl = curl_easy_init();
this->Curl = cm_curl_easy_init();
}
cmCTestCurl::~cmCTestCurl()

View File

@@ -177,7 +177,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
cmCTestCurlOpts curlOpts(this->CTest);
for (std::string const& file : files) {
/* get a curl handle */
curl = curl_easy_init();
curl = cm_curl_easy_init();
if (curl) {
cmCurlSetCAInfo(curl);
if (curlOpts.TLSVersionOpt) {

View File

@@ -226,3 +226,15 @@ std::string cmCurlFixFileURL(std::string url)
return url;
}
::CURL* cm_curl_easy_init()
{
::CURL* curl = curl_easy_init();
if (curl_version_info_data* cv = curl_version_info(CURLVERSION_FIRST)) {
// curl 8.7.x returns incorrect HTTP/2 error codes.
if (cv->version_num >= 0x080700 && cv->version_num < 0x080800) {
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
}
}
return curl;
}

View File

@@ -18,3 +18,5 @@ std::string cmCurlSetCAInfo(::CURL* curl, const std::string& cafile = {});
std::string cmCurlSetNETRCOption(::CURL* curl, const std::string& netrc_level,
const std::string& netrc_file);
std::string cmCurlFixFileURL(std::string url);
::CURL* cm_curl_easy_init();

View File

@@ -2117,7 +2117,7 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
::CURL* curl;
cmCurlInitOnce();
::curl_global_init(CURL_GLOBAL_DEFAULT);
curl = ::curl_easy_init();
curl = cm_curl_easy_init();
if (!curl) {
status.SetError("DOWNLOAD error initializing curl.");
return false;
@@ -2491,7 +2491,7 @@ bool HandleUploadCommand(std::vector<std::string> const& args,
::CURL* curl;
cmCurlInitOnce();
::curl_global_init(CURL_GLOBAL_DEFAULT);
curl = ::curl_easy_init();
curl = cm_curl_easy_init();
if (!curl) {
status.SetError("UPLOAD error initializing curl.");
fclose(fin);