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)); +    } +} | 
