diff options
author | Brad King <brad.king@kitware.com> | 2021-09-15 18:56:14 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2021-09-15 19:03:22 (GMT) |
commit | 63b5a6869e1793e4aeb815f220dd41419344c802 (patch) | |
tree | 8c40b2fad7932fdac83783e66aaa23af5f966e03 /Source/cmCurl.cxx | |
parent | c2c1c701c7f0768c382c819b6922b134690212ba (diff) | |
download | CMake-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.cxx | 35 |
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; +} |