diff options
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; +} |