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 | |
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')
-rw-r--r-- | indra/llcommon/lldate.cpp | 48 | ||||
-rw-r--r-- | indra/llcommon/lldate.h | 6 | ||||
-rw-r--r-- | indra/test/llhttpdate_tut.cpp | 72 |
3 files changed, 126 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 diff --git a/indra/test/llhttpdate_tut.cpp b/indra/test/llhttpdate_tut.cpp new file mode 100644 index 0000000000..2a82155cd1 --- /dev/null +++ b/indra/test/llhttpdate_tut.cpp @@ -0,0 +1,72 @@ +/** + * @file llhttpdate_tut.cpp + * @author Kartic Krishnamurthy + * @date Wednesday, 18 Jul 2007 17:00:00 GMT :) + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "linden_common.h" +#include "lltut.h" + +#include "lldate.h" +#include "llframetimer.h" + +#include <string> +#include <time.h> + +namespace tut +{ + struct httpdate_data + { + LLDate some_date; + }; + typedef test_group<httpdate_data> httpdate_test; + typedef httpdate_test::object httpdate_object; + tut::httpdate_test httpdate("httpdate"); + + template<> template<> + void httpdate_object::test<1>() + { + static std::string epoch_expected = "Thursday, 01 Jan 1970 00:00:00 GMT" ; + ensure("Check Epoch in RFC 1123", ( epoch_expected == some_date.asRFC1123())); + } + + template<> template<> + void httpdate_object::test<2>() + { + static std::string expected = "Wednesday, 18 Jul 2007 22:17:24 GMT" ; + some_date = LLDate(1184797044.037586); + ensure("Check some timestamp in RFC 1123", ( expected == some_date.asRFC1123())); + } + + // This test of course most generic.. runs off current time + template<> template<> + void httpdate_object::test<3>() + { + //F64 sometime = LLFrameTimer::getTotalSeconds(); + time_t sometime; + time(&sometime); + some_date = LLDate((F64) sometime); + struct tm result; + char expected[255], *actual; + + gmtime_r((time_t *)&sometime, &result); + /* + std::cout << " seconds: "<< result.tm_sec + << ", minutes: " << result.tm_min + << ", hours: " << result.tm_hour + << ", day of the month: " << result.tm_mday + << ", month: " << result.tm_mon + << ", year: " << result.tm_year + << ", day of the week: " << result.tm_wday + << ", day in the year: " << result.tm_yday + << ", DST: " << result.tm_isdst << std::endl; + */ + strftime(expected, 255, "%A, %d %h %Y %H:%M:%S GMT", &result); + actual = (char *) some_date.asRFC1123().c_str(); + // probably not a good idea to use strcmp but this is just a unit test + ensure("Current time in RFC 1123", (strcmp(expected, actual) == 0)); + } +} |