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).
This commit is contained in:
Brad King
2021-09-15 14:56:14 -04:00
parent c2c1c701c7
commit 63b5a6869e
3 changed files with 38 additions and 35 deletions

View File

@@ -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);