summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorKartic Krishnamurthy <drunkensufi@lindenlab.com>2007-07-20 23:11:04 +0000
committerKartic Krishnamurthy <drunkensufi@lindenlab.com>2007-07-20 23:11:04 +0000
commit45281046c5cf2d71b53c9f6c3d8d9ba74d29b33d (patch)
treeb709aec899afbfc5f77d3beebcf2eedfb4a560ac /indra
parentdd6a0467ed9c151a819626cf811553e4a8880e84 (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.cpp48
-rw-r--r--indra/llcommon/lldate.h6
-rw-r--r--indra/test/llhttpdate_tut.cpp72
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));
+ }
+}