#include "http_page.h" #include "hdir.h" #define AUTOINDEX_FILENAME_MAXLEN 50 void make_http_status_page(http_status status_code, std::string& page) { char szCode[8]; snprintf(szCode, sizeof(szCode), "%d ", status_code); const char* status_message = http_status_str(status_code); page += R"(
)", url, url);
page += c_str;
for (auto& item : dirs) {
if (item.name[0] == '.' && item.name[1] == '\0') continue;
int len = strlen(item.name) + (item.type == 'd');
// name
snprintf(c_str, sizeof(c_str), "%s%s",
item.name,
item.type == 'd' ? "/" : "",
len < AUTOINDEX_FILENAME_MAXLEN ? item.name : std::string(item.name, item.name+AUTOINDEX_FILENAME_MAXLEN-4).append("...").c_str(),
item.type == 'd' ? "/" : "");
page += c_str;
if (strcmp(item.name, "..") != 0) {
// mtime
struct tm* tm = localtime(&item.mtime);
snprintf(c_str, sizeof(c_str), "%04d-%02d-%02d %02d:%02d:%02d ",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
page += std::string(AUTOINDEX_FILENAME_MAXLEN - len, ' ');
page += c_str;
// size
if (item.type == 'd') {
page += '-';
}
else {
float hsize;
if (item.size < 1024) {
snprintf(c_str, sizeof(c_str), "%lu", item.size);
}
else if ((hsize = item.size/1024.0f) < 1024.0f) {
snprintf(c_str, sizeof(c_str), "%.1fK", hsize);
}
else if ((hsize /= 1024.0f) < 1024.0f) {
snprintf(c_str, sizeof(c_str), "%.1fM", hsize);
}
else {
hsize /= 1024.0f;
snprintf(c_str, sizeof(c_str), "%.1fG", hsize);
}
page += c_str;
}
}
page += "\r\n";
}
page += R"(