Index: net/base/cookie_monster.cc |
diff --git a/net/base/cookie_monster.cc b/net/base/cookie_monster.cc |
index dbae99adafb294eceb751578e053fe3f423218cf..6d9afcb0330de0fddfa872f38980907049c635fc 100644 |
--- a/net/base/cookie_monster.cc |
+++ b/net/base/cookie_monster.cc |
@@ -904,7 +904,6 @@ void CookieMonster::ParsedCookie::ParseTokenValuePairs( |
static const char kTerminator[] = "\n\r\0"; |
static const int kTerminatorLen = sizeof(kTerminator) - 1; |
static const char kWhitespace[] = " \t"; |
- static const char kQuoteTerminator[] = "\""; |
static const char kValueSeparator[] = ";"; |
static const char kTokenSeparator[] = ";="; |
@@ -987,36 +986,35 @@ void CookieMonster::ParsedCookie::ParseTokenValuePairs( |
// value_start should point at the first character of the value. |
value_start = it; |
- // The value is double quoted, process <quoted-string>. |
- if (it != end && *it == '"') { |
- // Skip over the first double quote, and parse until |
- // a terminating double quote or the end. |
- for (++it; it != end && !CharIsA(*it, kQuoteTerminator); ++it) { |
- // Allow an escaped \" in a double quoted string. |
- if (*it == '\\') { |
- ++it; |
- if (it == end) |
- break; |
- } |
- } |
- |
- SeekTo(&it, end, kValueSeparator); |
- // We could seek to the end, that's ok. |
- value_end = it; |
- } else { |
- // The value is non-quoted, process <token-value>. |
- // Just look for ';' to terminate ('=' allowed). |
- // We can hit the end, maybe they didn't terminate. |
- SeekTo(&it, end, kValueSeparator); |
- |
- // Ignore any whitespace between the value and the value separator |
- if (it != value_start) { // Could have an empty value |
- --it; |
- SeekBackPast(&it, value_start, kWhitespace); |
- ++it; |
- } |
- |
- value_end = it; |
+ // It is unclear exactly how quoted string values should be handled. |
+ // Major browsers do different things, for example, Firefox supports |
+ // semicolons embedded in a quoted value, while IE does not. Looking at |
+ // the specs, RFC 2109 and 2965 allow for a quoted-string as the value. |
+ // However, these specs were apparently written after browsers had |
+ // implemented cookies, and they seem very distant from the reality of |
+ // what is actually implemented and used on the web. The original spec |
+ // from Netscape is possibly what is closest to the cookies used today. |
+ // This spec didn't have explicit support for double quoted strings, and |
+ // states that ; is not allowed as part of a value. We had originally |
+ // implement the Firefox behavior (A="B;C"; -> A="B;C";). However, since |
+ // there is no standard that makes sense, we decided to follow the behavior |
+ // of IE and Safari, which is closer to the original Netscape proposal. |
+ // This means that A="B;C" -> A="B;. This also makes the code much simpler |
+ // and reduces the possibility for invalid cookies, where other browsers |
+ // like Opera currently reject those invalid cookies (ex A="B" "C";). |
+ |
+ // Just look for ';' to terminate ('=' allowed). |
+ // We can hit the end, maybe they didn't terminate. |
+ SeekTo(&it, end, kValueSeparator); |
+ |
+ // Will be pointed at the ; seperator or the end. |
+ value_end = it; |
+ |
+ // Ignore any unwanted whitespace after the value. |
+ if (value_end != value_start) { // Could have an empty value |
+ --value_end; |
+ SeekBackPast(&value_end, value_start, kWhitespace); |
+ ++value_end; |
} |
// OK, we're finished with a Token/Value. |