Bladeren bron

cmCurl: Adopt helper to fix file:// URLs

Migrate and generalize the helper added by commit e63dcb1378 (Encoding:
Use encoding libcurl expects with file: urls., 2014-11-05,
v3.2.0-rc1~420^2).
Brad King 4 jaren geleden
bovenliggende
commit
63b5a6869e
3 gewijzigde bestanden met toevoegingen van 38 en 35 verwijderingen
  1. 35 0
      Source/cmCurl.cxx
  2. 1 0
      Source/cmCurl.h
  3. 2 35
      Source/cmFileCommand.cxx

+ 35 - 0
Source/cmCurl.cxx

@@ -9,6 +9,14 @@
 #endif
 #include "cmStringAlgorithms.h"
 
+#if defined(_WIN32)
+#  include <vector>
+
+#  include <windows.h>
+
+#  include "cmsys/Encoding.hxx"
+#endif
+
 // curl versions before 7.21.5 did not provide this error code
 #if defined(LIBCURL_VERSION_NUM) && LIBCURL_VERSION_NUM < 0x071505
 #  define CURLE_NOT_BUILT_IN 4
@@ -95,3 +103,30 @@ std::string cmCurlSetNETRCOption(::CURL* curl, const std::string& netrc_level,
   }
   return e;
 }
+
+std::string cmCurlFixFileURL(std::string url)
+{
+  if (!cmHasLiteralPrefix(url, "file://")) {
+    return url;
+  }
+
+#if defined(_WIN32)
+  // libcurl doesn't support file:// urls for unicode filenames on Windows.
+  // Convert string from UTF-8 to ACP if this is a file:// URL.
+  std::wstring wurl = cmsys::Encoding::ToWide(url);
+  if (!wurl.empty()) {
+    int mblen =
+      WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, NULL, 0, NULL, NULL);
+    if (mblen > 0) {
+      std::vector<char> chars(mblen);
+      mblen = WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, &chars[0],
+                                  mblen, NULL, NULL);
+      if (mblen > 0) {
+        url = &chars[0];
+      }
+    }
+  }
+#endif
+
+  return url;
+}

+ 1 - 0
Source/cmCurl.h

@@ -11,3 +11,4 @@
 std::string cmCurlSetCAInfo(::CURL* curl, const char* cafile = nullptr);
 std::string cmCurlSetNETRCOption(::CURL* curl, const std::string& netrc_level,
                                  const std::string& netrc_file);
+std::string cmCurlFixFileURL(std::string url);

+ 2 - 35
Source/cmFileCommand.cxx

@@ -65,37 +65,8 @@
 #  include "cmFileLockResult.h"
 #endif
 
-#if defined(_WIN32)
-#  include <windows.h>
-#endif
-
 namespace {
 
-#if defined(_WIN32)
-// libcurl doesn't support file:// urls for unicode filenames on Windows.
-// Convert string from UTF-8 to ACP if this is a file:// URL.
-std::string fix_file_url_windows(const std::string& url)
-{
-  std::string ret = url;
-  if (strncmp(url.c_str(), "file://", 7) == 0) {
-    std::wstring wurl = cmsys::Encoding::ToWide(url);
-    if (!wurl.empty()) {
-      int mblen =
-        WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, NULL, 0, NULL, NULL);
-      if (mblen > 0) {
-        std::vector<char> chars(mblen);
-        mblen = WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, &chars[0],
-                                    mblen, NULL, NULL);
-        if (mblen > 0) {
-          ret = &chars[0];
-        }
-      }
-    }
-  }
-  return ret;
-}
-#endif
-
 bool HandleWriteImpl(std::vector<std::string> const& args, bool append,
                      cmExecutionStatus& status)
 {
@@ -1976,9 +1947,7 @@ bool HandleDownloadCommand(std::vector<std::string> const& args,
     }
   }
 
-#  if defined(_WIN32)
-  url = fix_file_url_windows(url);
-#  endif
+  url = cmCurlFixFileURL(url);
 
   ::CURL* curl;
   ::curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -2292,9 +2261,7 @@ bool HandleUploadCommand(std::vector<std::string> const& args,
 
   unsigned long file_size = cmsys::SystemTools::FileLength(filename);
 
-#  if defined(_WIN32)
-  url = fix_file_url_windows(url);
-#  endif
+  url = cmCurlFixFileURL(url);
 
   ::CURL* curl;
   ::curl_global_init(CURL_GLOBAL_DEFAULT);