mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-11 16:32:14 -06:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user