Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Unified Diff: net/cookies/canonical_cookie.cc

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/cookies/canonical_cookie.h ('k') | net/cookies/canonical_cookie_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/cookies/canonical_cookie.cc
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
deleted file mode 100644
index f0b3b3fa5fc74a09a16a6e48228cff26eed551de..0000000000000000000000000000000000000000
--- a/net/cookies/canonical_cookie.cc
+++ /dev/null
@@ -1,413 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Portions of this code based on Mozilla:
-// (netwerk/cookie/src/nsCookieService.cpp)
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 2003
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Daniel Witte (dwitte@stanford.edu)
- * Michiel van Leeuwen (mvl@exedo.nl)
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "net/cookies/canonical_cookie.h"
-
-#include "base/basictypes.h"
-#include "base/format_macros.h"
-#include "base/logging.h"
-#include "base/strings/stringprintf.h"
-#include "net/cookies/cookie_util.h"
-#include "net/cookies/parsed_cookie.h"
-#include "url/gurl.h"
-#include "url/url_canon.h"
-
-using base::Time;
-using base::TimeDelta;
-
-namespace net {
-
-namespace {
-
-const int kVlogSetCookies = 7;
-
-// Determine the cookie domain to use for setting the specified cookie.
-bool GetCookieDomain(const GURL& url,
- const ParsedCookie& pc,
- std::string* result) {
- std::string domain_string;
- if (pc.HasDomain())
- domain_string = pc.Domain();
- 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);
-}
-
-} // namespace
-
-CanonicalCookie::CanonicalCookie()
- : secure_(false),
- httponly_(false) {
-}
-
-CanonicalCookie::CanonicalCookie(
- 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,
- const base::Time& last_access, bool secure, bool httponly,
- CookiePriority priority)
- : source_(GetCookieSourceFromURL(url)),
- name_(name),
- value_(value),
- domain_(domain),
- path_(path),
- creation_date_(creation),
- expiry_date_(expiration),
- last_access_date_(last_access),
- secure_(secure),
- httponly_(httponly),
- priority_(priority) {
-}
-
-CanonicalCookie::CanonicalCookie(const GURL& url, const ParsedCookie& pc)
- : source_(GetCookieSourceFromURL(url)),
- name_(pc.Name()),
- value_(pc.Value()),
- path_(CanonPath(url, pc)),
- creation_date_(Time::Now()),
- last_access_date_(Time()),
- secure_(pc.IsSecure()),
- httponly_(pc.IsHttpOnly()),
- priority_(pc.Priority()) {
- if (pc.HasExpires())
- expiry_date_ = CanonExpiration(pc, creation_date_, creation_date_);
-
- // Do the best we can with the domain.
- std::string cookie_domain;
- std::string domain_string;
- if (pc.HasDomain()) {
- domain_string = pc.Domain();
- }
- bool result
- = cookie_util::GetCookieDomainWithString(url, domain_string,
- &cookie_domain);
- // Caller is responsible for passing in good arguments.
- DCHECK(result);
- domain_ = cookie_domain;
-}
-
-CanonicalCookie::~CanonicalCookie() {
-}
-
-std::string CanonicalCookie::GetCookieSourceFromURL(const GURL& url) {
- if (url.SchemeIsFile())
- return url.spec();
-
- url::Replacements<char> replacements;
- replacements.ClearPort();
- if (url.SchemeIsSecure())
- replacements.SetScheme("http", url::Component(0, 4));
-
- return url.GetOrigin().ReplaceComponents(replacements).spec();
-}
-
-// 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);
-}
-
-// static
-Time CanonicalCookie::CanonExpiration(const ParsedCookie& pc,
- const Time& current,
- const Time& server_time) {
- // First, try the Max-Age attribute.
- uint64 max_age = 0;
- if (pc.HasMaxAge() &&
-#ifdef COMPILER_MSVC
- sscanf_s(
-#else
- sscanf(
-#endif
- pc.MaxAge().c_str(), " %" PRIu64, &max_age) == 1) {
- return current + TimeDelta::FromSeconds(max_age);
- }
-
- // Try the Expires attribute.
- if (pc.HasExpires() && !pc.Expires().empty()) {
- // Adjust for clock skew between server and host.
- base::Time parsed_expiry = cookie_util::ParseCookieTime(pc.Expires());
- if (!parsed_expiry.is_null())
- return parsed_expiry + (current - server_time);
- }
-
- // Invalid or no expiration, persistent cookie.
- return Time();
-}
-
-// static
-CanonicalCookie* CanonicalCookie::Create(const GURL& url,
- const std::string& cookie_line,
- const base::Time& creation_time,
- const CookieOptions& options) {
- ParsedCookie parsed_cookie(cookie_line);
-
- if (!parsed_cookie.IsValid()) {
- VLOG(kVlogSetCookies) << "WARNING: Couldn't parse cookie";
- return NULL;
- }
-
- if (options.exclude_httponly() && parsed_cookie.IsHttpOnly()) {
- VLOG(kVlogSetCookies) << "Create() is not creating a httponly cookie";
- return NULL;
- }
-
- std::string cookie_domain;
- if (!GetCookieDomain(url, parsed_cookie, &cookie_domain)) {
- return NULL;
- }
-
- std::string cookie_path = CanonicalCookie::CanonPath(url, parsed_cookie);
- Time server_time(creation_time);
- if (options.has_server_time())
- server_time = options.server_time();
-
- Time cookie_expires = CanonicalCookie::CanonExpiration(parsed_cookie,
- creation_time,
- server_time);
-
- return new CanonicalCookie(url, parsed_cookie.Name(), parsed_cookie.Value(),
- cookie_domain, cookie_path, creation_time,
- cookie_expires, creation_time,
- parsed_cookie.IsSecure(),
- parsed_cookie.IsHttpOnly(),
- parsed_cookie.Priority());
-}
-
-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,
- 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 NULL;
- std::string parsed_value = ParsedCookie::ParseValueString(value);
- if (parsed_value != value)
- return NULL;
-
- std::string parsed_domain = ParsedCookie::ParseValueString(domain);
- if (parsed_domain != domain)
- return NULL;
- std::string cookie_domain;
- if (!cookie_util::GetCookieDomainWithString(url, parsed_domain,
- &cookie_domain)) {
- return NULL;
- }
-
- std::string parsed_path = ParsedCookie::ParseValueString(path);
- if (parsed_path != path)
- return NULL;
-
- 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 NULL;
- // 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 new CanonicalCookie(url, parsed_name, parsed_value, cookie_domain,
- cookie_path, creation, expiration, creation,
- secure, http_only, priority);
-}
-
-bool CanonicalCookie::IsOnPath(const std::string& url_path) const {
-
- // A zero length would be unsafe for our trailing '/' checks, and
- // would also make no sense for our prefix match. The code that
- // creates a CanonicalCookie should make sure the path is never zero length,
- // but we double check anyway.
- if (path_.empty())
- return false;
-
- // The Mozilla code broke this into three cases, based on if the cookie path
- // was longer, the same length, or shorter than the length of the url path.
- // I think the approach below is simpler.
-
- // Make sure the cookie path is a prefix of the url path. If the
- // url path is shorter than the cookie path, then the cookie path
- // can't be a prefix.
- if (url_path.find(path_) != 0)
- return false;
-
- // Now we know that url_path is >= cookie_path, and that cookie_path
- // is a prefix of url_path. If they are the are the same length then
- // they are identical, otherwise we need an additional check:
-
- // In order to avoid in correctly matching a cookie path of /blah
- // with a request path of '/blahblah/', we need to make sure that either
- // the cookie path ends in a trailing '/', or that we prefix up to a '/'
- // in the url path. Since we know that the url path length is greater
- // than the cookie path length, it's safe to index one byte past.
- if (path_.length() != url_path.length() &&
- path_[path_.length() - 1] != '/' &&
- url_path[path_.length()] != '/')
- return false;
-
- return true;
-}
-
-bool CanonicalCookie::IsDomainMatch(const std::string& host) const {
- // Can domain match in two ways; as a domain cookie (where the cookie
- // domain begins with ".") or as a host cookie (where it doesn't).
-
- // Some consumers of the CookieMonster expect to set cookies on
- // URLs like http://.strange.url. To retrieve cookies in this instance,
- // we allow matching as a host cookie even when the domain_ starts with
- // a period.
- if (host == domain_)
- return true;
-
- // Domain cookie must have an initial ".". To match, it must be
- // equal to url's host with initial period removed, or a suffix of
- // it.
-
- // Arguably this should only apply to "http" or "https" cookies, but
- // extension cookie tests currently use the funtionality, and if we
- // ever decide to implement that it should be done by preventing
- // such cookies from being set.
- if (domain_.empty() || domain_[0] != '.')
- return false;
-
- // The host with a "." prefixed.
- if (domain_.compare(1, std::string::npos, host) == 0)
- return true;
-
- // A pure suffix of the host (ok since we know the domain already
- // starts with a ".")
- return (host.length() > domain_.length() &&
- host.compare(host.length() - domain_.length(),
- domain_.length(), domain_) == 0);
-}
-
-bool CanonicalCookie::IncludeForRequestURL(const GURL& url,
- const CookieOptions& options) const {
- // Filter out HttpOnly cookies, per options.
- if (options.exclude_httponly() && IsHttpOnly())
- return false;
- // Secure cookies should not be included in requests for URLs with an
- // insecure scheme.
- if (IsSecure() && !url.SchemeIsSecure())
- return false;
- // Don't include cookies for requests that don't apply to the cookie domain.
- if (!IsDomainMatch(url.host()))
- return false;
- // Don't include cookies for requests with a url path that does not path
- // match the cookie-path.
- if (!IsOnPath(url.path()))
- return false;
-
- return true;
-}
-
-std::string CanonicalCookie::DebugString() const {
- return base::StringPrintf(
- "name: %s value: %s domain: %s path: %s creation: %"
- PRId64,
- name_.c_str(), value_.c_str(),
- domain_.c_str(), path_.c_str(),
- static_cast<int64>(creation_date_.ToTimeT()));
-}
-
-CanonicalCookie* CanonicalCookie::Duplicate() const {
- CanonicalCookie* cc = new CanonicalCookie();
- cc->source_ = source_;
- cc->name_ = name_;
- cc->value_ = value_;
- cc->domain_ = domain_;
- cc->path_ = path_;
- cc->creation_date_ = creation_date_;
- cc->expiry_date_ = expiry_date_;
- cc->last_access_date_ = last_access_date_;
- cc->secure_ = secure_;
- cc->httponly_ = httponly_;
- cc->priority_ = priority_;
- return cc;
-}
-
-} // namespace net
« no previous file with comments | « net/cookies/canonical_cookie.h ('k') | net/cookies/canonical_cookie_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698