Added SimpleWeb::Date::to_string to create HTTP date strings
This commit is contained in:
parent
3f1591b6fa
commit
83788f3885
3 changed files with 69 additions and 0 deletions
|
|
@ -7,3 +7,4 @@ SpaceBeforeParens: Never
|
||||||
BreakBeforeBraces: Custom
|
BreakBeforeBraces: Custom
|
||||||
BraceWrapping: {BeforeElse: true, BeforeCatch: true}
|
BraceWrapping: {BeforeElse: true, BeforeCatch: true}
|
||||||
NamespaceIndentation: All
|
NamespaceIndentation: All
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
|
|
||||||
|
|
@ -323,4 +323,6 @@ int main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT(SimpleWeb::Date::to_string(std::chrono::system_clock::now()).size() == 29);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
66
utility.hpp
66
utility.hpp
|
|
@ -3,7 +3,9 @@
|
||||||
|
|
||||||
#include "status_code.hpp"
|
#include "status_code.hpp"
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <ctime>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
@ -313,6 +315,70 @@ namespace SimpleWeb {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Date class working with formats specified in RFC 7231 Date/Time Formats
|
||||||
|
class Date {
|
||||||
|
public:
|
||||||
|
/// Returns the given std::chrono::system_clock::time_point as a string with the following format: Wed, 31 Jul 2019 11:34:23 GMT.
|
||||||
|
/// Warning: this function uses std::gmtime and is thus not thread safe.
|
||||||
|
static std::string to_string(const std::chrono::system_clock::time_point time_point) noexcept {
|
||||||
|
std::string result;
|
||||||
|
result.reserve(29);
|
||||||
|
|
||||||
|
auto time = std::chrono::system_clock::to_time_t(time_point);
|
||||||
|
auto gmtime = std::gmtime(&time);
|
||||||
|
|
||||||
|
switch(gmtime->tm_wday) {
|
||||||
|
case 0: result += "Sun, "; break;
|
||||||
|
case 1: result += "Mon, "; break;
|
||||||
|
case 2: result += "Tue, "; break;
|
||||||
|
case 3: result += "Wed, "; break;
|
||||||
|
case 4: result += "Thu, "; break;
|
||||||
|
case 5: result += "Fri, "; break;
|
||||||
|
case 6: result += "Sat, "; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
result += gmtime->tm_mday < 10 ? '0' : static_cast<char>(gmtime->tm_mday / 10 + 48);
|
||||||
|
result += static_cast<char>(gmtime->tm_mday % 10 + 48);
|
||||||
|
|
||||||
|
switch(gmtime->tm_mon) {
|
||||||
|
case 0: result += " Jan "; break;
|
||||||
|
case 1: result += " Feb "; break;
|
||||||
|
case 2: result += " Mar "; break;
|
||||||
|
case 3: result += " Apr "; break;
|
||||||
|
case 4: result += " May "; break;
|
||||||
|
case 5: result += " Jun "; break;
|
||||||
|
case 6: result += " Jul "; break;
|
||||||
|
case 7: result += " Aug "; break;
|
||||||
|
case 8: result += " Sep "; break;
|
||||||
|
case 9: result += " Oct "; break;
|
||||||
|
case 10: result += " Nov "; break;
|
||||||
|
case 11: result += " Des "; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto year = gmtime->tm_year + 1900;
|
||||||
|
result += static_cast<char>(year / 1000 + 48);
|
||||||
|
result += static_cast<char>((year / 100) % 10 + 48);
|
||||||
|
result += static_cast<char>((year / 10) % 10 + 48);
|
||||||
|
result += static_cast<char>(year % 10 + 48);
|
||||||
|
result += ' ';
|
||||||
|
|
||||||
|
result += gmtime->tm_hour < 10 ? '0' : static_cast<char>(gmtime->tm_hour / 10 + 48);
|
||||||
|
result += static_cast<char>(gmtime->tm_hour % 10 + 48);
|
||||||
|
result += ':';
|
||||||
|
|
||||||
|
result += gmtime->tm_min < 10 ? '0' : static_cast<char>(gmtime->tm_min / 10 + 48);
|
||||||
|
result += static_cast<char>(gmtime->tm_min % 10 + 48);
|
||||||
|
result += ':';
|
||||||
|
|
||||||
|
result += gmtime->tm_sec < 10 ? '0' : static_cast<char>(gmtime->tm_sec / 10 + 48);
|
||||||
|
result += static_cast<char>(gmtime->tm_sec % 10 + 48);
|
||||||
|
|
||||||
|
result += " GMT";
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
} // namespace SimpleWeb
|
} // namespace SimpleWeb
|
||||||
|
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue