summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@nokia.com>2009-03-26 13:52:03 (GMT)
committerPeter Hartmann <peter.hartmann@trolltech.com>2009-03-30 15:44:23 (GMT)
commit83dc49feaf56bdf469388174972fa6fc815b844b (patch)
tree6ed19c5508e42eb7359970c277deb92712efa6e6
parent0fe33578f03a0966c42f9fc44d80a49495f87878 (diff)
downloadQt-83dc49feaf56bdf469388174972fa6fc815b844b.zip
Qt-83dc49feaf56bdf469388174972fa6fc815b844b.tar.gz
Qt-83dc49feaf56bdf469388174972fa6fc815b844b.tar.bz2
Fix a few issues introduced by Ben's last patch.
Test if we're not past the end of the array before we attempt to read it. Dates without timezone information are taken to be UTC, so merge the code. If the date parsing failed, don't add a malformed cookie. Better to have no cookie than to have it for past its expiration date. Also update the autotests, since we now can cope with some of the invalid cookies seen on the net. Signed-off-by: Peter Hartmann <peter.hartmann@trolltech.com>
-rw-r--r--src/network/access/qnetworkcookie.cpp39
-rw-r--r--tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp11
2 files changed, 29 insertions, 21 deletions
diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp
index b127f18..56cb539 100644
--- a/src/network/access/qnetworkcookie.cpp
+++ b/src/network/access/qnetworkcookie.cpp
@@ -549,17 +549,25 @@ static const char months[] =
"dec\0"
"\0";
-static inline bool isNumber(char s) { return s >= '0' && s <= '9'; }
-static inline bool isTerminator (char c) { return c == '\n' || c == '\r'; }
-static inline bool isValueSeparator (char c) { return isTerminator(c) || c == ';'; }
-static inline bool isWhitespace (char c) { return c == ' ' || c == '\t'; }
+static inline bool isNumber(char s)
+{ return s >= '0' && s <= '9'; }
-static bool checkStaticArray(int &val, const QByteArray &dateString, int at, const char *array, size_t size) {
+static inline bool isTerminator(char c)
+{ return c == '\n' || c == '\r'; }
+
+static inline bool isValueSeparator(char c)
+{ return isTerminator(c) || c == ';'; }
+
+static inline bool isWhitespace(char c)
+{ return c == ' ' || c == '\t'; }
+
+static bool checkStaticArray(int &val, const QByteArray &dateString, int at, const char *array, int size)
+{
if (dateString[at] < 'a' || dateString[at] > 'z')
return false;
if (val == -1 && dateString.length() >= at + 3) {
int j = 0;
- size_t i = 0;
+ int i = 0;
while (i <= size) {
const char *str(array + i);
if (str[0] == dateString[at]
@@ -652,8 +660,7 @@ static QDateTime parseDateString(const QByteArray &dateString)
|| (dateString[at - 1] == 't'))) {
int end = 1;
- while (dateString[at + end] >= '0' && dateString[at + end] <= '9'
- && end < 5)
+ while (end < 5 && dateString[at + end] >= '0' && dateString[at + end] <= '9')
++end;
int minutes = 0;
int hours = 0;
@@ -879,13 +886,9 @@ static QDateTime parseDateString(const QByteArray &dateString)
if (!date.isValid())
date = QDate(day + y2k, month, year);
- QDateTime dateTime;
+ QDateTime dateTime(date, time, Qt::UTC);
- if (zoneOffset == -1) {
- dateTime = QDateTime(date, time);
- dateTime = dateTime.toTimeSpec(Qt::UTC);
- } else {
- dateTime = QDateTime(date, time, Qt::UTC);
+ if (zoneOffset != -1) {
dateTime = dateTime.addSecs(zoneOffset);
}
if (!dateTime.isValid())
@@ -961,6 +964,11 @@ QList<QNetworkCookie> QNetworkCookie::parseCookies(const QByteArray &cookieStrin
QByteArray dateString = cookieString.mid(position, end - position).trimmed();
position = end;
QDateTime dt = parseDateString(dateString.toLower());
+ if (!dt.isValid()) {
+ cookie = QNetworkCookie();
+ endOfCookie = true;
+ continue;
+ }
cookie.setExpirationDate(dt);
} else if (field.first == "domain") {
QByteArray rawDomain = field.second;
@@ -1005,7 +1013,8 @@ QList<QNetworkCookie> QNetworkCookie::parseCookies(const QByteArray &cookieStrin
endOfCookie = true;
}
- result += cookie;
+ if (!cookie.name().isEmpty())
+ result += cookie;
}
return result;
diff --git a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
index 9010db4..4da17d9 100644
--- a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -315,6 +315,9 @@ void tst_QNetworkCookie::parseSingleCookie_data()
cookie.setExpirationDate(QDateTime(QDate(9999, 12, 31), QTime(23, 59, 59), Qt::UTC));
QTest::newRow("network2") << "__siteid=1; expires=Fri, 31-Dec-9999 23:59:59 GMT; path=/" << cookie;
+ cookie = QNetworkCookie("YM.LC", "v=2&m=9993_262838_159_1558_1063_0_5649_4012_3776161073,9426_260205_549_1295_1336_0_5141_4738_3922731647,6733_258196_952_1364_643_0_3560_-1_0,3677_237633_1294_1294_19267_0_3244_29483_4102206176,1315_235149_1693_1541_941_0_3224_1691_1861378060,1858_214311_2100_1298_19538_0_2873_30900_716411652,6258_212007_2506_1285_1017_0_2868_3606_4288540264,3743_207884_2895_1362_2759_0_2545_7114_3388520216,2654_205253_3257_1297_1332_0_2504_4682_3048534803,1891_184881_3660_1291_19079_0_978_29178_2592538685&f=1&n=20&s=date&o=down&e=1196548712&b=Inbox&u=removed");
+ cookie.setPath("/");
+ cookie.setDomain("mail.yahoo.com");
QTest::newRow("network3") << "YM.LC=v=2&m=9993_262838_159_1558_1063_0_5649_4012_3776161073,9426_260205_549_1295_1336_0_5141_4738_3922731647,6733_258196_952_1364_643_0_3560_-1_0,3677_237633_1294_1294_19267_0_3244_29483_4102206176,1315_235149_1693_1541_941_0_3224_1691_1861378060,1858_214311_2100_1298_19538_0_2873_30900_716411652,6258_212007_2506_1285_1017_0_2868_3606_4288540264,3743_207884_2895_1362_2759_0_2545_7114_3388520216,2654_205253_3257_1297_1332_0_2504_4682_3048534803,1891_184881_3660_1291_19079_0_978_29178_2592538685&f=1&n=20&s=date&o=down&e=1196548712&b=Inbox&u=removed; path=/; domain=mail.yahoo.com" << cookie;
cookie = QNetworkCookie("__ac", "c2hhdXNtYW46U2FTYW80Wm8%3D");
@@ -330,9 +333,9 @@ void tst_QNetworkCookie::parseSingleCookie()
QList<QNetworkCookie> result = QNetworkCookie::parseCookies(cookieString.toLatin1());
- QEXPECT_FAIL("network2", "QDateTime parsing problem: the date is beyond year 8000", Abort);
- QEXPECT_FAIL("network3", "Cookie value contains commas, violating the HTTP spec", Abort);
+ //QEXPECT_FAIL("network2", "QDateTime parsing problem: the date is beyond year 8000", Abort);
QCOMPARE(result.count(), 1);
+ QEXPECT_FAIL("network3", "Cookie value contains commas, violating the HTTP spec", Abort);
QCOMPARE(result.at(0), expectedCookie);
result = QNetworkCookie::parseCookies(result.at(0).toRawForm());
@@ -358,9 +361,7 @@ void tst_QNetworkCookie::parseMultipleCookies_data()
// reason: malformed NAME=VALUE pair
QTest::newRow("invalid-05") << "foo" << list;
QTest::newRow("invalid-06") << "=b" << list;
- QTest::newRow("invalid-08") << "a=b,foo" << list;
QTest::newRow("invalid-09") << "foo,a=b" << list;
- QTest::newRow("invalid-10") << "a=b,=b" << list;
QTest::newRow("invalid-11") << ";path=/" << list;
// reason: malformed expiration date string
@@ -369,8 +370,6 @@ void tst_QNetworkCookie::parseMultipleCookies_data()
QTest::newRow("invalid-14") << "a=b;expires=foobar, abc" << list;
QTest::newRow("invalid-15") << "a=b;expires=foobar, dd-mmm-yyyy hh:mm:ss GMT; path=/" << list;
QTest::newRow("invalid-16") << "a=b;expires=foobar, 32-Caz-1999 24:01:60 GMT; path=/" << list;
- QTest::newRow("invalid-17") << "a=b,c=d;expires=" << list;
- QTest::newRow("invalid-18") << "a=b, c=d; expires=foobar, 32-Caz-1999 24:01:60 GMT; path=/" << list;
QNetworkCookie cookie;
cookie.setName("a");