修复: 升级框架并完善报告导出

- 升级 Drogon 和 Trantor,修复畸形请求导致的连接计数泄漏\n- 增加第三方框架版本校验与自动重建\n- 完善完整报告导出和接口文档
This commit is contained in:
cloud
2026-08-10 09:50:09 +08:00
parent 99ed321d24
commit 0e28826073
82 changed files with 3095 additions and 566 deletions
+52 -11
View File
@@ -155,9 +155,24 @@ bool isInteger(std::string_view str)
bool isBase64(std::string_view str)
{
for (auto c : str)
if (!isBase64(c))
if (str.empty())
return false;
size_t padding = 0;
if (str.back() == '=')
padding++;
if (str.size() > 1 && str[str.size() - 2] == '=')
padding++;
for (size_t i = 0; i < str.size() - padding; ++i)
{
if (!isBase64(str[i]))
return false;
}
if (padding > 0 && (str.size() % 4 != 0))
return false;
return true;
}
@@ -1018,6 +1033,35 @@ std::string gzipDecompress(const char *data, const size_t ndata)
}
}
static int formatHttpDate(char *buf, size_t len, const trantor::Date &date)
{
static const char *const weekdays[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
static const char *const months[] = {"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"};
struct tm tm = date.tmStruct();
return snprintf(buf,
len,
"%s, %02d %s %04d %02d:%02d:%02d GMT",
weekdays[tm.tm_wday],
tm.tm_mday,
months[tm.tm_mon],
tm.tm_year + 1900,
tm.tm_hour,
tm.tm_min,
tm.tm_sec);
}
char *getHttpFullDate(const trantor::Date &date)
{
static thread_local int64_t lastSecond = 0;
@@ -1029,9 +1073,7 @@ char *getHttpFullDate(const trantor::Date &date)
return lastTimeString;
}
lastSecond = nowSecond;
date.toCustomFormattedString("%a, %d %b %Y %H:%M:%S GMT",
lastTimeString,
sizeof(lastTimeString));
formatHttpDate(lastTimeString, sizeof(lastTimeString), date);
return lastTimeString;
}
@@ -1039,8 +1081,6 @@ void dateToCustomFormattedString(const std::string &fmtStr,
std::string &str,
const trantor::Date &date)
{
auto nowSecond =
date.microSecondsSinceEpoch() / trantor::Date::MICRO_SECONDS_PER_SEC;
struct tm tm_LValue = date.tmStruct();
std::stringstream Out;
Out.imbue(std::locale{"C"});
@@ -1051,7 +1091,7 @@ void dateToCustomFormattedString(const std::string &fmtStr,
const std::string &getHttpFullDateStr(const trantor::Date &date)
{
static thread_local int64_t lastSecond = 0;
static thread_local std::string lastTimeString(128, 0);
static thread_local std::string lastTimeString;
auto nowSecond =
date.microSecondsSinceEpoch() / trantor::Date::MICRO_SECONDS_PER_SEC;
if (nowSecond == lastSecond)
@@ -1059,9 +1099,10 @@ const std::string &getHttpFullDateStr(const trantor::Date &date)
return lastTimeString;
}
lastSecond = nowSecond;
dateToCustomFormattedString("%a, %d %b %Y %H:%M:%S GMT",
lastTimeString,
date);
lastTimeString.resize(128);
int n = formatHttpDate(lastTimeString.data(), lastTimeString.size(), date);
n = std::clamp(n, 0, static_cast<int>(lastTimeString.size() - 1));
lastTimeString.resize(static_cast<size_t>(n));
return lastTimeString;
}