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 | |
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).
-rw-r--r-- | Source/cmCurl.cxx | 35 | ||||
-rw-r--r-- | Source/cmCurl.h | 1 | ||||
-rw-r--r-- | Source/cmFileCommand.cxx | 37 |
3 files changed, 38 insertions, 35 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; +} diff --git a/Source/cmCurl.h b/Source/cmCurl.h index fb716f8..9c1e337 100644 --- a/Source/cmCurl.h +++ b/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); diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 2730a07..1223d2a 100644 --- a/Source/cmFileCommand.cxx +++ b/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); |