diff options
author | Kartic Krishnamurthy <drunkensufi@lindenlab.com> | 2007-07-20 23:11:04 +0000 |
---|---|---|
committer | Kartic Krishnamurthy <drunkensufi@lindenlab.com> | 2007-07-20 23:11:04 +0000 |
commit | 45281046c5cf2d71b53c9f6c3d8d9ba74d29b33d (patch) | |
tree | b709aec899afbfc5f77d3beebcf2eedfb4a560ac /indra/llcommon | |
parent | dd6a0467ed9c151a819626cf811553e4a8880e84 (diff) |
Fixed cache invalidation in simulator.cpp, llsd.php, added RFC 1123 compliant date format, and unit test for the new date function
Diffstat (limited to 'indra/llcommon')
-rw-r--r-- | indra/llcommon/lldate.cpp | 48 | ||||
-rw-r--r-- | indra/llcommon/lldate.h | 6 |
2 files changed, 54 insertions, 0 deletions
diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp index 6ae2a1145f..58193ca1e0 100644 --- a/indra/llcommon/lldate.cpp +++ b/indra/llcommon/lldate.cpp @@ -52,6 +52,54 @@ std::string LLDate::asString() const return stream.str(); } +//@ brief Converts time in seconds since EPOCH +// to RFC 1123 compliant date format +// E.g. 1184797044.037586 == Wednesday, 18 Jul 2007 22:17:24 GMT +// in RFC 1123. HTTP dates are always in GMT and RFC 1123 +// is one of the standards used and the prefered format +std::string LLDate::asRFC1123() const +{ + std::ostringstream stream; + toHTTPDateStream(stream); + return stream.str(); +} + +void LLDate::toHTTPDateStream(std::ostream& s) const +{ + // http://apr.apache.org/docs/apr/0.9/group__apr__time.html + apr_time_t time = (apr_time_t)(mSecondsSinceEpoch * LL_APR_USEC_PER_SEC); + + apr_time_exp_t exp_time ; //Apache time module + + if (apr_time_exp_gmt(&exp_time, time) != APR_SUCCESS) + { + // Return Epoch UTC date + s << "Thursday, 01 Jan 1970 00:00:00 GMT" ; + return; + } + + s << std::dec << std::setfill('0'); +#if( LL_WINDOWS || __GNUC__ > 2) + s << std::right ; +#else + s.setf(ios::right); +#endif + std::string day = weekdays[exp_time.tm_wday]; + std::string month = months[exp_time.tm_mon]; + + s << std::setw(day.length()) << (day) + << ", " << std::setw(2) << (exp_time.tm_mday) + << ' ' << std::setw(month.length()) << (month) + << ' ' << std::setw(4) << (exp_time.tm_year + 1900) + << ' ' << std::setw(2) << (exp_time.tm_hour) + << ':' << std::setw(2) << (exp_time.tm_min) + << ':' << std::setw(2) << (exp_time.tm_sec) + << " GMT"; + + // RFC 1123 date does not use microseconds + llinfos << "Date in RFC 1123 format is " << s << llendl; +} + void LLDate::toStream(std::ostream& s) const { apr_time_t time = (apr_time_t)(mSecondsSinceEpoch * LL_APR_USEC_PER_SEC); diff --git a/indra/llcommon/lldate.h b/indra/llcommon/lldate.h index 854613ad0b..6ebc8ebbe7 100644 --- a/indra/llcommon/lldate.h +++ b/indra/llcommon/lldate.h @@ -57,7 +57,9 @@ public: * @return A string representation of the date. */ std::string asString() const; + std::string asRFC1123() const; void toStream(std::ostream&) const; + void toHTTPDateStream(std::ostream&) const; /** * @brief Set the date from an ISO-8601 string. * @@ -99,4 +101,8 @@ std::ostream& operator<<(std::ostream& s, const LLDate& date); std::istream& operator>>(std::istream& s, LLDate& date); +const static std::string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + +const static std::string months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + #endif // LL_LLDATE_H |