| 807 | } |
| 808 | |
| 809 | Result HttpAsyncFileServer::Internal::formatHttpDate(int64_t millisecondsSinceEpoch, char* buffer, size_t bufferSize, |
| 810 | size_t& outLength) |
| 811 | { |
| 812 | const time_t seconds = static_cast<time_t>(millisecondsSinceEpoch / 1000); |
| 813 | struct tm parsedTm; |
| 814 | #if SC_PLATFORM_WINDOWS |
| 815 | if (_gmtime64_s(&parsedTm, &seconds) != 0) |
| 816 | { |
| 817 | return Result::Error("Failed to convert time"); |
| 818 | } |
| 819 | #else |
| 820 | if (gmtime_r(&seconds, &parsedTm) == nullptr) |
| 821 | { |
| 822 | return Result::Error("Failed to convert time"); |
| 823 | } |
| 824 | #endif |
| 825 | |
| 826 | // Format as HTTP date: "Wed, 21 Oct 2015 07:28:00 GMT" |
| 827 | const char* days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; |
| 828 | const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; |
| 829 | |
| 830 | outLength = static_cast<size_t>( |
| 831 | snprintf(buffer, bufferSize, "%s, %02d %s %04d %02d:%02d:%02d GMT", days[parsedTm.tm_wday], parsedTm.tm_mday, |
| 832 | months[parsedTm.tm_mon], parsedTm.tm_year + 1900, parsedTm.tm_hour, parsedTm.tm_min, parsedTm.tm_sec)); |
| 833 | |
| 834 | if (outLength == 0 || outLength >= bufferSize) |
| 835 | { |
| 836 | return Result::Error("Failed to format time"); |
| 837 | } |
| 838 | |
| 839 | return Result(true); |
| 840 | } |
| 841 | |
| 842 | Result HttpAsyncFileServer::Internal::formatContentRange(const ByteRange& range, size_t fileSize, char* buffer, |
| 843 | size_t bufferSize, size_t& outLength) |