More fixes to the cookie parser.

- Fix parsing of strings shorter than 24 bytes (which can only happen if
  the year has only 3 digits, or the day in month, hour, minute or
  seconds have only 1).
- Only allow the GMT and UTC timezone specifiers, as all HTTP dates
  should use the GMT zone (but still use a format that allows specifying
  a timezone name).

All cookie tests are now passing.
This commit is contained in:
Adrien Destugues
2016-10-30 20:23:43 +01:00
parent b5c858aa75
commit cec123b4de
+12 -14
View File
@@ -1,9 +1,10 @@
/*
* Copyright 2010 Haiku Inc. All rights reserved.
* Copyright 2010-2016 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Christophe Huriaux, [email protected]
* Adrien Destugues, [email protected]
*/
#include <HttpTime.h>
@@ -16,6 +17,8 @@
static const char* kDateFormats[] = {
"%a, %d %b %Y %H:%M:%S",
"%a, %d-%b-%Y %H:%M:%S",
"%a, %d-%b-%Y %H:%M:%S GMT",
"%a, %d-%b-%Y %H:%M:%S UTC",
"%A, %d-%b-%y %H:%M:%S",
"%a %d %b %H:%M:%S %Y"
};
@@ -76,16 +79,8 @@ BHttpTime::Parse()
if (fDateString.Length() < 4)
return 0;
expireTime.tm_sec = 0;
expireTime.tm_min = 0;
expireTime.tm_hour = 0;
expireTime.tm_mday = 0;
expireTime.tm_mon = 0;
expireTime.tm_year = 0;
expireTime.tm_wday = 0;
expireTime.tm_yday = 0;
expireTime.tm_isdst = 0;
memset(&expireTime, 0, sizeof(struct tm));
fDateFormat = B_HTTP_TIME_FORMAT_PARSED;
unsigned int i;
for (i = 0; i < sizeof(kDateFormats) / sizeof(const char*);
@@ -93,17 +88,20 @@ BHttpTime::Parse()
const char* result = strptime(fDateString.String(), kDateFormats[i],
&expireTime);
// Make sure we parsed enough of the date string, not just a small
// part of it.
if (result != NULL && result > fDateString.String() + 24) {
// We need to parse the complete value for the "Expires" key.
// Otherwise, we consider this to be a session cookie (or try another
// one of the date formats).
if (result == fDateString.String() + fDateString.Length()) {
fDateFormat = i;
break;
}
}
// Did we identify some valid format?
if (fDateFormat == B_HTTP_TIME_FORMAT_PARSED)
return 0;
// Now convert the struct tm from strptime into a BDateTime.
BTime time(expireTime.tm_hour, expireTime.tm_min, expireTime.tm_sec);
BDate date(expireTime.tm_year + 1900, expireTime.tm_mon + 1,
expireTime.tm_mday);