Chromium Code Reviews| Index: net/cookies/canonical_cookie.cc |
| diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc |
| index ddf35e0531d48dd08db1624b647e0bbc720b391e..57ab39604fc10360127ae6c95699d9202e2832fc 100644 |
| --- a/net/cookies/canonical_cookie.cc |
| +++ b/net/cookies/canonical_cookie.cc |
| @@ -47,6 +47,7 @@ |
| #include "base/basictypes.h" |
| #include "base/format_macros.h" |
| #include "base/logging.h" |
| +#include "base/metrics/histogram_macros.h" |
| #include "base/strings/stringprintf.h" |
| #include "net/cookies/cookie_util.h" |
| #include "net/cookies/parsed_cookie.h" |
| @@ -116,21 +117,6 @@ int PartialCookieOrdering(const CanonicalCookie& a, const CanonicalCookie& b) { |
| return a.Path().compare(b.Path()); |
| } |
| -// Returns true if the cookie does not violate any constraints imposed |
| -// by the cookie name's prefix, as described in |
| -// https://tools.ietf.org/html/draft-west-cookie-prefixes |
| -bool IsCookiePrefixValid(const GURL& url, const ParsedCookie& parsed_cookie) { |
| - const char kSecurePrefix[] = "$Secure-"; |
| - const char kHostPrefix[] = "$Host-"; |
| - if (parsed_cookie.Name().find(kSecurePrefix) == 0) |
| - return parsed_cookie.IsSecure() && url.SchemeIsCryptographic(); |
| - if (parsed_cookie.Name().find(kHostPrefix) == 0) { |
| - return parsed_cookie.IsSecure() && url.SchemeIsCryptographic() && |
| - !parsed_cookie.HasDomain() && parsed_cookie.Path() == "/"; |
| - } |
| - return true; |
| -} |
| - |
| } // namespace |
| CanonicalCookie::CanonicalCookie() |
| @@ -263,7 +249,11 @@ CanonicalCookie* CanonicalCookie::Create(const GURL& url, |
| creation_time, |
| server_time); |
| - if (options.enforce_prefixes() && !IsCookiePrefixValid(url, parsed_cookie)) { |
| + CookiePrefix prefix = CanonicalCookie::GetCookiePrefix(parsed_cookie.Name()); |
| + bool is_cookie_valid = |
| + CanonicalCookie::IsCookiePrefixValid(prefix, url, parsed_cookie); |
| + CanonicalCookie::RecordCookiePrefixMetrics(prefix, is_cookie_valid); |
| + if (options.enforce_prefixes() && !is_cookie_valid) { |
| VLOG(kVlogSetCookies) |
| << "Create() failed because the cookie violated prefix rules."; |
| return nullptr; |
| @@ -469,4 +459,47 @@ bool CanonicalCookie::FullCompare(const CanonicalCookie& other) const { |
| return Priority() < other.Priority(); |
| } |
| +// static |
| +CanonicalCookie::CookiePrefix CanonicalCookie::GetCookiePrefix( |
| + const std::string& name) { |
| + const char kSecurePrefix[] = "$Secure-"; |
| + const char kHostPrefix[] = "$Host-"; |
| + if (name.find(kSecurePrefix) == 0) |
| + return CanonicalCookie::COOKIE_PREFIX_SECURE; |
| + if (name.find(kHostPrefix) == 0) |
| + return CanonicalCookie::COOKIE_PREFIX_HOST; |
| + return CanonicalCookie::COOKIE_PREFIX_NONE; |
| +} |
| + |
| +// static |
| +void CanonicalCookie::RecordCookiePrefixMetrics( |
| + CanonicalCookie::CookiePrefix prefix, |
| + bool is_cookie_valid) { |
| + const char kCookiePrefixHistogram[] = "Cookie.CookiePrefix"; |
| + const char kCookiePrefixBlockedHistogram[] = "Cookie.CookiePrefixBlocked"; |
| + UMA_HISTOGRAM_ENUMERATION(kCookiePrefixHistogram, prefix, |
| + CanonicalCookie::COOKIE_PREFIX_LAST); |
| + if (!is_cookie_valid) { |
| + UMA_HISTOGRAM_ENUMERATION(kCookiePrefixBlockedHistogram, prefix, |
| + CanonicalCookie::COOKIE_PREFIX_LAST); |
|
Mike West
2015/11/20 14:43:58
It might be easier to compare numbers if these wer
estark
2015/11/20 18:19:32
It might be because I started trying to write code
|
| + } |
| +} |
| + |
| +// Returns true if the cookie does not violate any constraints imposed |
| +// by the cookie name's prefix, as described in |
| +// https://tools.ietf.org/html/draft-west-cookie-prefixes |
| +// |
| +// static |
| +bool CanonicalCookie::IsCookiePrefixValid(CanonicalCookie::CookiePrefix prefix, |
| + const GURL& url, |
| + const ParsedCookie& parsed_cookie) { |
| + if (prefix == CanonicalCookie::COOKIE_PREFIX_SECURE) |
| + return parsed_cookie.IsSecure() && url.SchemeIsCryptographic(); |
| + if (prefix == CanonicalCookie::COOKIE_PREFIX_HOST) { |
| + return parsed_cookie.IsSecure() && url.SchemeIsCryptographic() && |
| + !parsed_cookie.HasDomain() && parsed_cookie.Path() == "/"; |
| + } |
| + return true; |
| +} |
| + |
| } // namespace net |