Просмотр исходного кода

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.
Derek Bruening 10 лет назад
Родитель
Сommit
2a6e0b611b
2 измененных файлов с 14 добавлено и 0 удалено
  1. 6 0
      Source/CTest/cmCTestCurl.cxx
  2. 8 0
      Source/CTest/cmCTestSubmitHandler.cxx

+ 6 - 0
Source/CTest/cmCTestCurl.cxx

@@ -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 )
     {
     {

+ 8 - 0
Source/CTest/cmCTestSubmitHandler.cxx

@@ -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;
 }
 }