Index: net/cookies/canonical_cookie.h |
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4a710b2c87892ab435d8b5704eb5970bfb232ec6 |
--- /dev/null |
+++ b/net/cookies/canonical_cookie.h |
@@ -0,0 +1,156 @@ |
+// 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. |
+ |
+#ifndef NET_COOKIES_CANONICAL_COOKIE_H_ |
+#define NET_COOKIES_CANONICAL_COOKIE_H_ |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/time.h" |
+#include "net/base/net_export.h" |
+ |
+class GURL; |
+ |
+namespace net { |
+ |
+class ParsedCookie; |
+ |
+class NET_EXPORT CanonicalCookie { |
+ public: |
+ |
+ // These constructors do no validation or canonicalization of their inputs; |
+ // the resulting CanonicalCookies should not be relied on to be canonical |
+ // unless the caller has done appropriate validation and canonicalization |
+ // themselves. |
+ CanonicalCookie(); |
+ CanonicalCookie(const GURL& url, |
+ const std::string& name, |
+ const std::string& value, |
+ const std::string& domain, |
+ const std::string& path, |
+ const std::string& mac_key, |
+ const std::string& mac_algorithm, |
+ const base::Time& creation, |
+ const base::Time& expiration, |
+ const base::Time& last_access, |
+ bool secure, |
+ bool httponly); |
+ |
+ // This constructor does canonicalization but not validation. |
+ // The result of this constructor should not be relied on in contexts |
+ // in which pre-validation of the ParsedCookie has not been done. |
+ CanonicalCookie(const GURL& url, const ParsedCookie& pc); |
+ |
+ ~CanonicalCookie(); |
+ |
+ // Supports the default copy constructor. |
+ |
+ // Creates a canonical cookie from parsed cookie. |
+ // Canonicalizes and validates inputs. May return NULL if an attribute |
+ // value is invalid. |
+ static CanonicalCookie* Create(const GURL& url, |
+ const ParsedCookie& pc); |
+ |
+ // Creates a canonical cookie from unparsed attribute values. |
+ // Canonicalizes and validates inputs. May return NULL if an attribute |
+ // value is invalid. |
+ static CanonicalCookie* Create(const GURL& url, |
+ const std::string& name, |
+ const std::string& value, |
+ const std::string& domain, |
+ const std::string& path, |
+ const std::string& mac_key, |
+ const std::string& mac_algorithm, |
+ const base::Time& creation, |
+ const base::Time& expiration, |
+ bool secure, |
+ bool http_only); |
+ |
+ const std::string& Source() const { return source_; } |
+ const std::string& Name() const { return name_; } |
+ const std::string& Value() const { return value_; } |
+ const std::string& Domain() const { return domain_; } |
+ const std::string& Path() const { return path_; } |
+ const std::string& MACKey() const { return mac_key_; } |
+ const std::string& MACAlgorithm() const { return mac_algorithm_; } |
+ const base::Time& CreationDate() const { return creation_date_; } |
+ const base::Time& LastAccessDate() const { return last_access_date_; } |
+ bool IsPersistent() const { return !expiry_date_.is_null(); } |
+ const base::Time& ExpiryDate() const { return expiry_date_; } |
+ bool IsSecure() const { return secure_; } |
+ bool IsHttpOnly() const { return httponly_; } |
+ bool IsDomainCookie() const { |
+ return !domain_.empty() && domain_[0] == '.'; } |
+ bool IsHostCookie() const { return !IsDomainCookie(); } |
+ |
+ bool IsExpired(const base::Time& current) { |
+ return !expiry_date_.is_null() && current >= expiry_date_; |
+ } |
+ |
+ // Are the cookies considered equivalent in the eyes of RFC 2965. |
+ // The RFC says that name must match (case-sensitive), domain must |
+ // match (case insensitive), and path must match (case sensitive). |
+ // For the case insensitive domain compare, we rely on the domain |
+ // having been canonicalized (in |
+ // GetCookieDomainWithString->CanonicalizeHost). |
+ bool IsEquivalent(const CanonicalCookie& ecc) const { |
+ // It seems like it would make sense to take secure and httponly into |
+ // account, but the RFC doesn't specify this. |
+ // NOTE: Keep this logic in-sync with TrimDuplicateCookiesForHost(). |
+ return (name_ == ecc.Name() && domain_ == ecc.Domain() |
+ && path_ == ecc.Path()); |
+ } |
+ |
+ void SetLastAccessDate(const base::Time& date) { |
+ last_access_date_ = date; |
+ } |
+ |
+ bool IsOnPath(const std::string& url_path) const; |
+ bool IsDomainMatch(const std::string& scheme, const std::string& host) const; |
+ |
+ std::string DebugString() const; |
+ |
+ // Returns the cookie source when cookies are set for |url|. This function |
+ // is public for unit test purposes only. |
+ static std::string GetCookieSourceFromURL(const GURL& url); |
+ static std::string CanonPath(const GURL& url, const ParsedCookie& pc); |
+ static base::Time CanonExpiration(const ParsedCookie& pc, |
+ const base::Time& current, |
+ const base::Time& server_time); |
+ |
+ private: |
+ // Gives the session cookie an expiration time if needed |
+ void SetSessionCookieExpiryTime(); |
+ |
+ // The source member of a canonical cookie is the origin of the URL that tried |
+ // to set this cookie, minus the port number if any. This field is not |
+ // persistent though; its only used in the in-tab cookies dialog to show the |
+ // user the source URL. This is used for both allowed and blocked cookies. |
+ // When a CanonicalCookie is constructed from the backing store (common case) |
+ // this field will be null. CanonicalCookie consumers should not rely on |
+ // this field unless they guarantee that the creator of those |
+ // CanonicalCookies properly initialized the field. |
+ // TODO(abarth): We might need to make this field persistent for MAC cookies. |
+ std::string source_; |
+ std::string name_; |
+ std::string value_; |
+ std::string domain_; |
+ std::string path_; |
+ std::string mac_key_; // TODO(abarth): Persist to disk. |
+ std::string mac_algorithm_; // TODO(abarth): Persist to disk. |
+ base::Time creation_date_; |
+ base::Time expiry_date_; |
+ base::Time last_access_date_; |
+ bool secure_; |
+ bool httponly_; |
+}; |
+ |
+class CookieList : public std::vector<CanonicalCookie> { |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_COOKIES_CANONICAL_COOKIE_H_ |