Browse Source
Replace non-threadsafe gmtime and setlocale
Make DateTimeStrFormat use boost::posix_time.
Also re-enable the util_DateTimeStrFormat tests, as they are no
longer platform specific.
try
Wladimir J. van der Laan
11 years ago
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
4 changed files with
15 additions and
20 deletions
-
src/rpcprotocol.cpp
-
src/test/util_tests.cpp
-
src/util.cpp
-
src/util.h
|
|
@ -51,15 +51,7 @@ string HTTPPost(const string& strMsg, const map<string,string>& mapRequestHeader |
|
|
|
|
|
|
|
static string rfc1123Time() |
|
|
|
{ |
|
|
|
char buffer[64]; |
|
|
|
time_t now; |
|
|
|
time(&now); |
|
|
|
struct tm* now_gmt = gmtime(&now); |
|
|
|
string locale(setlocale(LC_TIME, NULL)); |
|
|
|
setlocale(LC_TIME, "C"); // we want POSIX (aka "C") weekday/month strings
|
|
|
|
strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt); |
|
|
|
setlocale(LC_TIME, locale.c_str()); |
|
|
|
return string(buffer); |
|
|
|
return DateTimeStrFormat("%a, %d %b %Y %H:%M:%S +0000", GetTime()); |
|
|
|
} |
|
|
|
|
|
|
|
string HTTPReply(int nStatus, const string& strMsg, bool keepalive) |
|
|
|
|
|
@ -108,13 +108,11 @@ BOOST_AUTO_TEST_CASE(util_HexStr) |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(util_DateTimeStrFormat) |
|
|
|
{ |
|
|
|
/*These are platform-dependant and thus removed to avoid useless test failures
|
|
|
|
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M:%S", 0), "1970-01-01 00:00:00"); |
|
|
|
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M:%S", 0x7FFFFFFF), "2038-01-19 03:14:07"); |
|
|
|
// Formats used within Bitcoin
|
|
|
|
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M:%S", 1317425777), "2011-09-30 23:36:17"); |
|
|
|
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M", 1317425777), "2011-09-30 23:36"); |
|
|
|
*/ |
|
|
|
BOOST_CHECK_EQUAL(DateTimeStrFormat("%a, %d %b %Y %H:%M:%S +0000", 1317425777), "Fri, 30 Sep 2011 23:36:17 +0000"); |
|
|
|
} |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(util_ParseParameters) |
|
|
|
|
|
@ -14,6 +14,8 @@ |
|
|
|
|
|
|
|
#include <stdarg.h> |
|
|
|
|
|
|
|
#include <boost/date_time/posix_time/posix_time.hpp> |
|
|
|
|
|
|
|
#ifndef WIN32 |
|
|
|
// for posix_fallocate
|
|
|
|
#ifdef __linux_ |
|
|
@ -1400,3 +1402,13 @@ void SetupEnvironment() |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) |
|
|
|
{ |
|
|
|
// std::locale takes ownership of the pointer
|
|
|
|
std::locale loc(std::locale::classic(), new boost::posix_time::time_facet(pszFormat)); |
|
|
|
std::stringstream ss; |
|
|
|
ss.imbue(loc); |
|
|
|
ss << boost::posix_time::from_time_t(nTime); |
|
|
|
return ss.str(); |
|
|
|
} |
|
|
|
|
|
@ -325,14 +325,7 @@ inline int64_t GetTimeMicros() |
|
|
|
boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds(); |
|
|
|
} |
|
|
|
|
|
|
|
inline std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) |
|
|
|
{ |
|
|
|
time_t n = nTime; |
|
|
|
struct tm* ptmTime = gmtime(&n); |
|
|
|
char pszTime[200]; |
|
|
|
strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime); |
|
|
|
return pszTime; |
|
|
|
} |
|
|
|
std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime); |
|
|
|
|
|
|
|
inline bool IsSwitchChar(char c) |
|
|
|
{ |
|
|
|