فهرست منبع

file(DOWNLOAD|UPLOAD): Add HTTPHEADER suboption

Ruslan Baratov 9 سال پیش
والد
کامیت
8f6cb36695

+ 3 - 0
Help/command/file.rst

@@ -225,6 +225,9 @@ Options to both ``DOWNLOAD`` and ``UPLOAD`` are:
 ``USERPWD <username>:<password>``
   Set username and password for operation.
 
+``HTTPHEADER <HTTP-header>``
+  HTTP header for operation. Suboption can be repeated several times.
+
 Additional options to ``DOWNLOAD`` are:
 
 ``EXPECTED_HASH ALGO=<value>``

+ 5 - 0
Help/release/dev/file-curl-httpheader.rst

@@ -0,0 +1,5 @@
+file-curl-httpheader
+--------------------
+
+* The :command:`file(DOWNLOAD)` and :command:`file(UPLOAD)` commands
+  gained a ``HTTPHEADER <HTTP-header>`` option.

+ 36 - 0
Source/cmFileCommand.cxx

@@ -2483,6 +2483,8 @@ bool cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args)
   bool showProgress = false;
   std::string userpwd;
 
+  std::list<std::string> curl_headers;
+
   while (i != args.end()) {
     if (*i == "TIMEOUT") {
       ++i;
@@ -2572,6 +2574,13 @@ bool cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args)
         return false;
       }
       userpwd = *i;
+    } else if (*i == "HTTPHEADER") {
+      ++i;
+      if (i == args.end()) {
+        this->SetError("DOWNLOAD missing string for HTTPHEADER.");
+        return false;
+      }
+      curl_headers.push_back(*i);
     } else {
       // Do not return error for compatibility reason.
       std::string err = "Unexpected argument: ";
@@ -2716,8 +2725,17 @@ bool cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args)
     check_curl_result(res, "DOWNLOAD cannot set user password: ");
   }
 
+  struct curl_slist* headers = CM_NULLPTR;
+  for (std::list<std::string>::const_iterator h = curl_headers.begin();
+       h != curl_headers.end(); ++h) {
+    headers = ::curl_slist_append(headers, h->c_str());
+  }
+  ::curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
   res = ::curl_easy_perform(curl);
 
+  ::curl_slist_free_all(headers);
+
   /* always cleanup */
   g_curl.release();
   ::curl_easy_cleanup(curl);
@@ -2798,6 +2816,8 @@ bool cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args)
   bool showProgress = false;
   std::string userpwd;
 
+  std::list<std::string> curl_headers;
+
   while (i != args.end()) {
     if (*i == "TIMEOUT") {
       ++i;
@@ -2838,6 +2858,13 @@ bool cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args)
         return false;
       }
       userpwd = *i;
+    } else if (*i == "HTTPHEADER") {
+      ++i;
+      if (i == args.end()) {
+        this->SetError("UPLOAD missing string for HTTPHEADER.");
+        return false;
+      }
+      curl_headers.push_back(*i);
     } else {
       // Do not return error for compatibility reason.
       std::string err = "Unexpected argument: ";
@@ -2956,8 +2983,17 @@ bool cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args)
     check_curl_result(res, "UPLOAD cannot set user password: ");
   }
 
+  struct curl_slist* headers = CM_NULLPTR;
+  for (std::list<std::string>::const_iterator h = curl_headers.begin();
+       h != curl_headers.end(); ++h) {
+    headers = ::curl_slist_append(headers, h->c_str());
+  }
+  ::curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
   res = ::curl_easy_perform(curl);
 
+  ::curl_slist_free_all(headers);
+
   /* always cleanup */
   g_curl.release();
   ::curl_easy_cleanup(curl);

+ 1 - 0
Tests/RunCMake/file/DOWNLOAD-httpheader-not-set-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/file/DOWNLOAD-httpheader-not-set-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at DOWNLOAD-httpheader-not-set.cmake:[0-9]+ \(file\):
+  file DOWNLOAD missing string for HTTPHEADER.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)$

+ 1 - 0
Tests/RunCMake/file/DOWNLOAD-httpheader-not-set.cmake

@@ -0,0 +1 @@
+file(DOWNLOAD "" "" HTTPHEADER "Content-Type: application/x-compressed-tar" HTTPHEADER)

+ 2 - 0
Tests/RunCMake/file/RunCMakeTest.cmake

@@ -2,8 +2,10 @@ include(RunCMake)
 
 run_cmake(DOWNLOAD-hash-mismatch)
 run_cmake(DOWNLOAD-unused-argument)
+run_cmake(DOWNLOAD-httpheader-not-set)
 run_cmake(DOWNLOAD-pass-not-set)
 run_cmake(UPLOAD-unused-argument)
+run_cmake(UPLOAD-httpheader-not-set)
 run_cmake(UPLOAD-pass-not-set)
 run_cmake(INSTALL-DIRECTORY)
 run_cmake(INSTALL-MESSAGE-bad)

+ 1 - 0
Tests/RunCMake/file/UPLOAD-httpheader-not-set-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/file/UPLOAD-httpheader-not-set-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at UPLOAD-httpheader-not-set.cmake:[0-9]+ \(file\):
+  file UPLOAD missing string for HTTPHEADER.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)$

+ 1 - 0
Tests/RunCMake/file/UPLOAD-httpheader-not-set.cmake

@@ -0,0 +1 @@
+file(UPLOAD "" "" HTTPHEADER "Content-Type: application/x-compressed-tar" HTTPHEADER)