hrev46752 adds 1 changeset to branch 'master' old head: 8e887ea2444c49fea9576a21dff916444c265512 new head: 35480631f29e3eea3a25a14beaa4944cc811c0f7 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=3548063+%5E8e887ea ---------------------------------------------------------------------------- 3548063: Fix various issues with cookie time. * This is more tricky than it looks. * We probably want easier conversions from struct tm to BDateTime, and direct parsing/formating there. [ Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev46752 Commit: 35480631f29e3eea3a25a14beaa4944cc811c0f7 URL: http://cgit.haiku-os.org/haiku/commit/?id=3548063 Author: Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> Date: Thu Jan 23 18:22:20 2014 UTC ---------------------------------------------------------------------------- 2 files changed, 14 insertions(+), 12 deletions(-) src/kits/network/libnetapi/HttpTime.cpp | 13 ++++--------- src/kits/network/libnetapi/NetworkCookie.cpp | 13 ++++++++++--- ---------------------------------------------------------------------------- diff --git a/src/kits/network/libnetapi/HttpTime.cpp b/src/kits/network/libnetapi/HttpTime.cpp index b3cd5d6..ada9851 100644 --- a/src/kits/network/libnetapi/HttpTime.cpp +++ b/src/kits/network/libnetapi/HttpTime.cpp @@ -100,14 +100,9 @@ BHttpTime::Parse() fDateFormat = B_HTTP_TIME_FORMAT_ASCTIME; } -// return timegm(&expireTime); -// TODO: The above was used initially. See http://en.wikipedia.org/wiki/Time.h -// stippi: I don't know how Christophe had this code compiling initially, -// since Haiku does not appear to implement timegm(). -// Using mktime() doesn't cut it, as cookies set with a date shortly in the -// future (eg. 1 hour) would expire immediately. BTime time(expireTime.tm_hour, expireTime.tm_min, expireTime.tm_sec); - BDate date(expireTime.tm_year, expireTime.tm_mon, expireTime.tm_mday); + BDate date(expireTime.tm_year + 1900, expireTime.tm_mon + 1, + expireTime.tm_mday); BDateTime dateTime(date, time); return dateTime; } @@ -122,8 +117,8 @@ BHttpTime::ToString(int8 format) expirationTm.tm_min = fDate.Time().Minute(); expirationTm.tm_hour = fDate.Time().Hour(); expirationTm.tm_mday = fDate.Date().Day(); - expirationTm.tm_mon = fDate.Date().Month(); - expirationTm.tm_year = fDate.Date().Day(); + expirationTm.tm_mon = fDate.Date().Month() - 1; + expirationTm.tm_year = fDate.Date().Year() - 1900; expirationTm.tm_wday = 0; expirationTm.tm_yday = 0; expirationTm.tm_isdst = 0; diff --git a/src/kits/network/libnetapi/NetworkCookie.cpp b/src/kits/network/libnetapi/NetworkCookie.cpp index d27b8c2..e7c16ff 100644 --- a/src/kits/network/libnetapi/NetworkCookie.cpp +++ b/src/kits/network/libnetapi/NetworkCookie.cpp @@ -69,8 +69,15 @@ BNetworkCookie::BNetworkCookie(BMessage* archive) archive->FindBool(kArchivedCookieHttpOnly, &fHttpOnly); archive->FindBool(kArchivedCookieHostOnly, &fHostOnly); + // We store the expiration date as a string, which should not overflow. + // But we still parse the old archive format, where an int32 was used. + BString expirationString; int32 expiration; - if (archive->FindInt32(kArchivedCookieExpirationDate, &expiration) + if (archive->FindString(kArchivedCookieExpirationDate, &expirationString) + == B_OK) { + BDateTime time = BHttpTime(expirationString).Parse(); + SetExpirationDate(time); + } else if (archive->FindInt32(kArchivedCookieExpirationDate, &expiration) == B_OK) { SetExpirationDate((time_t)expiration); } @@ -581,8 +588,8 @@ BNetworkCookie::Archive(BMessage* into, bool deep) const } if (HasExpirationDate()) { - error = into->AddInt32(kArchivedCookieExpirationDate, - fExpiration.Time_t()); + error = into->AddString(kArchivedCookieExpirationDate, + BHttpTime(fExpiration).ToString()); if (error != B_OK) return error; }