summaryrefslogtreecommitdiffstats
path: root/Source/cmCurl.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2021-09-15 18:56:14 (GMT)
committerBrad King <brad.king@kitware.com>2021-09-15 19:03:22 (GMT)
commit63b5a6869e1793e4aeb815f220dd41419344c802 (patch)
tree8c40b2fad7932fdac83783e66aaa23af5f966e03 /Source/cmCurl.cxx
parentc2c1c701c7f0768c382c819b6922b134690212ba (diff)
downloadCMake-63b5a6869e1793e4aeb815f220dd41419344c802.zip
CMake-63b5a6869e1793e4aeb815f220dd41419344c802.tar.gz
CMake-63b5a6869e1793e4aeb815f220dd41419344c802.tar.bz2
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).
Diffstat (limited to 'Source/cmCurl.cxx')
-rw-r--r--Source/cmCurl.cxx35
1 files changed, 35 insertions, 0 deletions
diff --git a/Source/cmCurl.cxx b/Source/cmCurl.cxx
index 233790e..7a6568e 100644
--- a/Source/cmCurl.cxx
+++ b/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;
+}