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.
This commit is contained in:
Adrien Destugues
2014-01-23 19:24:34 +01:00
parent 8e887ea244
commit 35480631f2
2 changed files with 14 additions and 12 deletions
+4 -9
View File
@@ -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;
+10 -3
View File
@@ -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;
}