upgrade core add header check and incrace upload speed

This commit is contained in:
UnknownObject
2026-08-05 17:35:27 +08:00
parent 45af94e535
commit 1f11a9d348
76 changed files with 2059 additions and 642 deletions
+96 -3
View File
@@ -167,7 +167,7 @@ std::string uns::tools::ToLower(const std::string& s)
return r;
}
std::string uns::tools::CalculateFileHashSHA256(const std::string & file)
std::string uns::tools::CalculateFileHashSHA256(const std::string& file)
{
// 1. 以二进制模式打开文件
std::ifstream ifs(file, std::ios::binary);
@@ -175,7 +175,7 @@ std::string uns::tools::CalculateFileHashSHA256(const std::string & file)
return std::string();
// 2. 初始化 OpenSSL EVP 上下文,使用智能指针自动管理内存释放
std::unique_ptr<EVP_MD_CTX, void(*)(EVP_MD_CTX*)> ctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
if (!ctx)
if (!ctx)
return std::string();
// 3. 指定使用 SHA256 算法
if (EVP_DigestInit_ex(ctx.get(), EVP_sha256(), nullptr) != 1)
@@ -205,7 +205,100 @@ std::string uns::tools::CalculateFileHashSHA256(const std::string & file)
return hex_result;
}
bool uns::secure::IsSafePath(const std::string & safe_path, const std::string & requested_path)
Json::Value uns::tools::SafeJsonDecode(const std::string& str)
{
try
{
Json::Value root;
Json::Reader reader;
if (!reader.parse(str, root, false))
return Json::nullValue;
else
return root;
}
catch (...)
{
return Json::nullValue;
}
}
namespace
{
template <typename> inline constexpr bool always_false_v = false;
template <typename T, typename CharT>
T do_sto(const std::basic_string<CharT>& str, std::size_t* pos, int base)
{
if constexpr (std::is_same_v<T, int>)
return std::stoi(str, pos, base);
else if constexpr (std::is_same_v<T, long>)
return std::stol(str, pos, base);
else if constexpr (std::is_same_v<T, long long>)
return std::stoll(str, pos, base);
else if constexpr (std::is_same_v<T, unsigned long>)
return std::stoul(str, pos, base);
else if constexpr (std::is_same_v<T, unsigned long long>)
return std::stoull(str, pos, base);
else if constexpr (std::is_same_v<T, float>)
return std::stof(str, pos);
else if constexpr (std::is_same_v<T, double>)
return std::stod(str, pos);
else if constexpr (std::is_same_v<T, long double>)
return std::stold(str, pos);
else
static_assert(always_false_v<T>, "不支持的转换类型!");
}
}
template <typename T, typename CharT>
std::optional<T> uns::tools::SafeStoX(const std::basic_string<CharT>& str, std::size_t* pos, int base)
{
try
{
return do_sto<T>(str, pos, base);
}
catch (...)
{
return std::nullopt;
}
}
template <typename T, typename CharT>
std::optional<T> uns::tools::SafeStoX(std::basic_string_view<CharT> str, std::size_t* pos, int base)
{
return SafeStoX<T>(std::basic_string<CharT>(str), pos, base);
}
bool uns::secure::IsSafePath(const std::string& safe_path, const std::string& requested_path)
{
return PathTraversal::IsSafePath(safe_path, requested_path);
}
namespace uns
{
namespace tools
{
// -------------------------------------------------------------
// 显式模板实例化(注意:必须放在命名空间内部!)
// -------------------------------------------------------------
#define INSTANTIATE_SAFE_STO(T, CharT) \
template std::optional<T> UNSWSC_DLL_EXPORT SafeStoX<T, CharT>(const std::basic_string<CharT>&, std::size_t*, int); \
template std::optional<T> UNSWSC_DLL_EXPORT SafeStoX<T, CharT>(std::basic_string_view<CharT>, std::size_t*, int);
#define INSTANTIATE_ALL_NUMERIC_TYPES(CharT) \
INSTANTIATE_SAFE_STO(int, CharT) \
INSTANTIATE_SAFE_STO(long, CharT) \
INSTANTIATE_SAFE_STO(long long, CharT) \
INSTANTIATE_SAFE_STO(unsigned long, CharT) \
INSTANTIATE_SAFE_STO(unsigned long long, CharT) \
INSTANTIATE_SAFE_STO(float, CharT) \
INSTANTIATE_SAFE_STO(double, CharT) \
INSTANTIATE_SAFE_STO(long double, CharT)
INSTANTIATE_ALL_NUMERIC_TYPES(char)
INSTANTIATE_ALL_NUMERIC_TYPES(wchar_t)
#undef INSTANTIATE_ALL_NUMERIC_TYPES
#undef INSTANTIATE_SAFE_STO
}
}