CTest: Set Content-Type header for http file upload (#15774)

Sets the Content-Type header for http file uploads to avoid running afoul
of ModSecurity rules on the server.
This commit is contained in:
Derek Bruening 2015-10-07 17:51:26 -04:00 committed by Brad King
parent 3187de20fd
commit 2a6e0b611b
2 changed files with 14 additions and 0 deletions

View File

@ -166,6 +166,10 @@ bool cmCTestCurl::UploadFile(std::string const& local_file,
curlWriteMemoryCallback); curlWriteMemoryCallback);
::curl_easy_setopt(this->Curl, CURLOPT_DEBUGFUNCTION, ::curl_easy_setopt(this->Curl, CURLOPT_DEBUGFUNCTION,
curlDebugCallback); curlDebugCallback);
// Be sure to set Content-Type to satisfy fussy modsecurity rules
struct curl_slist *headers = ::curl_slist_append(NULL,
"Content-Type: text/xml");
::curl_easy_setopt(this->Curl, CURLOPT_HTTPHEADER, headers);
std::vector<char> responseData; std::vector<char> responseData;
std::vector<char> debugData; std::vector<char> debugData;
::curl_easy_setopt(this->Curl, CURLOPT_FILE, (void *)&responseData); ::curl_easy_setopt(this->Curl, CURLOPT_FILE, (void *)&responseData);
@ -174,6 +178,8 @@ bool cmCTestCurl::UploadFile(std::string const& local_file,
// Now run off and do what you've been told! // Now run off and do what you've been told!
::curl_easy_perform(this->Curl); ::curl_easy_perform(this->Curl);
::fclose(ftpfile); ::fclose(ftpfile);
::curl_easy_setopt(this->Curl, CURLOPT_HTTPHEADER, NULL);
::curl_slist_free_all(headers);
if ( responseData.size() > 0 ) if ( responseData.size() > 0 )
{ {

View File

@ -338,6 +338,8 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
CURLcode res; CURLcode res;
FILE* ftpfile; FILE* ftpfile;
char error_buffer[1024]; char error_buffer[1024];
struct curl_slist *headers = ::curl_slist_append(NULL,
"Content-Type: text/xml");
/* In windows, this will init the winsock stuff */ /* In windows, this will init the winsock stuff */
::curl_global_init(CURL_GLOBAL_ALL); ::curl_global_init(CURL_GLOBAL_ALL);
@ -420,6 +422,9 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
::curl_easy_setopt(curl, CURLOPT_PUT, 1); ::curl_easy_setopt(curl, CURLOPT_PUT, 1);
::curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); ::curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
// Be sure to set Content-Type to satisfy fussy modsecurity rules
::curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
std::string local_file = *file; std::string local_file = *file;
if ( !cmSystemTools::FileExists(local_file.c_str()) ) if ( !cmSystemTools::FileExists(local_file.c_str()) )
{ {
@ -477,6 +482,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
cmCTestLog(this->CTest, ERROR_MESSAGE, " Cannot find file: " cmCTestLog(this->CTest, ERROR_MESSAGE, " Cannot find file: "
<< local_file << std::endl); << local_file << std::endl);
::curl_easy_cleanup(curl); ::curl_easy_cleanup(curl);
::curl_slist_free_all(headers);
::curl_global_cleanup(); ::curl_global_cleanup();
return false; return false;
} }
@ -621,6 +627,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
<< std::endl); << std::endl);
} }
::curl_easy_cleanup(curl); ::curl_easy_cleanup(curl);
::curl_slist_free_all(headers);
::curl_global_cleanup(); ::curl_global_cleanup();
return false; return false;
} }
@ -630,6 +637,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
" Uploaded: " + local_file << std::endl, this->Quiet); " Uploaded: " + local_file << std::endl, this->Quiet);
} }
} }
::curl_slist_free_all(headers);
::curl_global_cleanup(); ::curl_global_cleanup();
return true; return true;
} }