| Index: net/cookies/canonical_cookie.cc
|
| diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
|
| index 2b53e4ee497fa4ed7e3fa6652afd0e8221e53b16..2eb732b7d237964077ff129922dc82fd83acdbf1 100644
|
| --- a/net/cookies/canonical_cookie.cc
|
| +++ b/net/cookies/canonical_cookie.cc
|
| @@ -74,36 +74,6 @@ bool GetCookieDomain(const GURL& url,
|
| return cookie_util::GetCookieDomainWithString(url, domain_string, result);
|
| }
|
|
|
| -std::string CanonPathWithString(const GURL& url,
|
| - const std::string& path_string) {
|
| - // The RFC says the path should be a prefix of the current URL path.
|
| - // However, Mozilla allows you to set any path for compatibility with
|
| - // broken websites. We unfortunately will mimic this behavior. We try
|
| - // to be generous and accept cookies with an invalid path attribute, and
|
| - // default the path to something reasonable.
|
| -
|
| - // The path was supplied in the cookie, we'll take it.
|
| - if (!path_string.empty() && path_string[0] == '/')
|
| - return path_string;
|
| -
|
| - // The path was not supplied in the cookie or invalid, we will default
|
| - // to the current URL path.
|
| - // """Defaults to the path of the request URL that generated the
|
| - // Set-Cookie response, up to, but not including, the
|
| - // right-most /."""
|
| - // How would this work for a cookie on /? We will include it then.
|
| - const std::string& url_path = url.path();
|
| -
|
| - size_t idx = url_path.find_last_of('/');
|
| -
|
| - // The cookie path was invalid or a single '/'.
|
| - if (idx == 0 || idx == std::string::npos)
|
| - return std::string("/");
|
| -
|
| - // Return up to the rightmost '/'.
|
| - return url_path.substr(0, idx);
|
| -}
|
| -
|
| // Compares cookies using name, domain and path, so that "equivalent" cookies
|
| // (per RFC 2965) are equal to each other.
|
| int PartialCookieOrdering(const CanonicalCookie& a, const CanonicalCookie& b) {
|
| @@ -130,12 +100,35 @@ CanonicalCookie::CanonicalCookie(const CanonicalCookie& other) = default;
|
| CanonicalCookie::~CanonicalCookie() {}
|
|
|
| // static
|
| -std::string CanonicalCookie::CanonPath(const GURL& url,
|
| - const ParsedCookie& pc) {
|
| - std::string path_string;
|
| - if (pc.HasPath())
|
| - path_string = pc.Path();
|
| - return CanonPathWithString(url, path_string);
|
| +std::string CanonicalCookie::CanonPathWithString(
|
| + const GURL& url,
|
| + const std::string& path_string) {
|
| + // The RFC says the path should be a prefix of the current URL path.
|
| + // However, Mozilla allows you to set any path for compatibility with
|
| + // broken websites. We unfortunately will mimic this behavior. We try
|
| + // to be generous and accept cookies with an invalid path attribute, and
|
| + // default the path to something reasonable.
|
| +
|
| + // The path was supplied in the cookie, we'll take it.
|
| + if (!path_string.empty() && path_string[0] == '/')
|
| + return path_string;
|
| +
|
| + // The path was not supplied in the cookie or invalid, we will default
|
| + // to the current URL path.
|
| + // """Defaults to the path of the request URL that generated the
|
| + // Set-Cookie response, up to, but not including, the
|
| + // right-most /."""
|
| + // How would this work for a cookie on /? We will include it then.
|
| + const std::string& url_path = url.path();
|
| +
|
| + size_t idx = url_path.find_last_of('/');
|
| +
|
| + // The cookie path was invalid or a single '/'.
|
| + if (idx == 0 || idx == std::string::npos)
|
| + return std::string("/");
|
| +
|
| + // Return up to the rightmost '/'.
|
| + return url_path.substr(0, idx);
|
| }
|
|
|
| // static
|
| @@ -201,7 +194,9 @@ std::unique_ptr<CanonicalCookie> CanonicalCookie::Create(
|
| return nullptr;
|
| }
|
|
|
| - std::string cookie_path = CanonicalCookie::CanonPath(url, parsed_cookie);
|
| + std::string cookie_path = CanonPathWithString(
|
| + url, parsed_cookie.HasPath() ? parsed_cookie.Path() : std::string());
|
| +
|
| Time server_time(creation_time);
|
| if (options.has_server_time())
|
| server_time = options.server_time();
|
| @@ -229,62 +224,6 @@ std::unique_ptr<CanonicalCookie> CanonicalCookie::Create(
|
|
|
| // static
|
| std::unique_ptr<CanonicalCookie> CanonicalCookie::Create(
|
| - const GURL& url,
|
| - const std::string& name,
|
| - const std::string& value,
|
| - const std::string& domain,
|
| - const std::string& path,
|
| - const base::Time& creation,
|
| - const base::Time& expiration,
|
| - bool secure,
|
| - bool http_only,
|
| - CookieSameSite same_site,
|
| - CookiePriority priority) {
|
| - // Expect valid attribute tokens and values, as defined by the ParsedCookie
|
| - // logic, otherwise don't create the cookie.
|
| - std::string parsed_name = ParsedCookie::ParseTokenString(name);
|
| - if (parsed_name != name)
|
| - return nullptr;
|
| - std::string parsed_value = ParsedCookie::ParseValueString(value);
|
| - if (parsed_value != value)
|
| - return nullptr;
|
| -
|
| - std::string parsed_domain = ParsedCookie::ParseValueString(domain);
|
| - if (parsed_domain != domain)
|
| - return nullptr;
|
| - std::string cookie_domain;
|
| - if (!cookie_util::GetCookieDomainWithString(url, parsed_domain,
|
| - &cookie_domain)) {
|
| - return nullptr;
|
| - }
|
| -
|
| - if (secure && !url.SchemeIsCryptographic())
|
| - return nullptr;
|
| -
|
| - std::string parsed_path = ParsedCookie::ParseValueString(path);
|
| - if (parsed_path != path)
|
| - return nullptr;
|
| -
|
| - std::string cookie_path = CanonPathWithString(url, parsed_path);
|
| - // Expect that the path was either not specified (empty), or is valid.
|
| - if (!parsed_path.empty() && cookie_path != parsed_path)
|
| - return nullptr;
|
| - // Canonicalize path again to make sure it escapes characters as needed.
|
| - url::Component path_component(0, cookie_path.length());
|
| - url::RawCanonOutputT<char> canon_path;
|
| - url::Component canon_path_component;
|
| - url::CanonicalizePath(cookie_path.data(), path_component, &canon_path,
|
| - &canon_path_component);
|
| - cookie_path = std::string(canon_path.data() + canon_path_component.begin,
|
| - canon_path_component.len);
|
| -
|
| - return base::WrapUnique(new CanonicalCookie(
|
| - parsed_name, parsed_value, cookie_domain, cookie_path, creation,
|
| - expiration, creation, secure, http_only, same_site, priority));
|
| -}
|
| -
|
| -// static
|
| -std::unique_ptr<CanonicalCookie> CanonicalCookie::Create(
|
| const std::string& name,
|
| const std::string& value,
|
| const std::string& domain,
|
| @@ -296,6 +235,9 @@ std::unique_ptr<CanonicalCookie> CanonicalCookie::Create(
|
| bool http_only,
|
| CookieSameSite same_site,
|
| CookiePriority priority) {
|
| + DCHECK(!name.empty());
|
| + DCHECK(!path.empty());
|
| +
|
| return base::WrapUnique(
|
| new CanonicalCookie(name, value, domain, path, creation, expiration,
|
| last_access, secure, http_only, same_site, priority));
|
|
|