Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebCore / platform / Cookie.h
1 /*
2  * Copyright (C) 2009 Joseph Pecoraro. All rights reserved.
3  * Copyright (C) 2017-2018 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #pragma once
28
29 #include <wtf/URL.h>
30 #include <wtf/text/StringHash.h>
31 #include <wtf/text/WTFString.h>
32
33 #ifdef __OBJC__
34 #include <objc/objc.h>
35 #endif
36
37 namespace WebCore {
38
39 struct Cookie {
40     Cookie() = default;
41     Cookie(WTF::HashTableDeletedValueType)
42         : name(WTF::HashTableDeletedValue)
43     {
44     }
45
46     template<class Encoder> void encode(Encoder&) const;
47     template<class Decoder> static std::optional<Cookie> decode(Decoder&);
48
49     WEBCORE_EXPORT bool operator==(const Cookie&) const;
50     WEBCORE_EXPORT unsigned hash() const;
51
52 #ifdef __OBJC__
53     WEBCORE_EXPORT Cookie(NSHTTPCookie *);
54     WEBCORE_EXPORT operator NSHTTPCookie *() const;
55 #elif USE(SOUP)
56     explicit Cookie(SoupCookie*);
57     SoupCookie* toSoupCookie() const;
58 #endif
59
60     bool isNull() const
61     {
62         return name.isNull()
63             && value.isNull()
64             && domain.isNull()
65             && path.isNull()
66             && !created
67             && !expires
68             && !httpOnly
69             && !secure
70             && !session
71             && comment.isNull()
72             && commentURL.isNull();
73     }
74     
75     String name;
76     String value;
77     String domain;
78     String path;
79     // Creation and expiration dates are expressed as milliseconds since the UNIX epoch.
80     double created { 0 };
81     double expires { 0 };
82     bool httpOnly { false };
83     bool secure { false };
84     bool session { false };
85     String comment;
86     URL commentURL;
87     Vector<uint16_t> ports;
88
89     enum class SameSitePolicy { None, Lax, Strict };
90     SameSitePolicy sameSite { SameSitePolicy::None };
91 };
92
93 struct CookieHash {
94     static unsigned hash(const Cookie& key)
95     {
96         return key.hash();
97     }
98
99     static bool equal(const Cookie& a, const Cookie& b)
100     {
101         return a == b;
102     }
103     static const bool safeToCompareToEmptyOrDeleted = false;
104 };
105
106 template<class Encoder>
107 void Cookie::encode(Encoder& encoder) const
108 {
109     encoder << name;
110     encoder << value;
111     encoder << domain;
112     encoder << path;
113     encoder << created;
114     encoder << expires;
115     encoder << httpOnly;
116     encoder << secure;
117     encoder << session;
118     encoder << comment;
119     encoder << commentURL;
120     encoder << ports;
121     encoder << sameSite;
122 }
123
124 template<class Decoder>
125 std::optional<Cookie> Cookie::decode(Decoder& decoder)
126 {
127     Cookie cookie;
128     if (!decoder.decode(cookie.name))
129         return std::nullopt;
130     if (!decoder.decode(cookie.value))
131         return std::nullopt;
132     if (!decoder.decode(cookie.domain))
133         return std::nullopt;
134     if (!decoder.decode(cookie.path))
135         return std::nullopt;
136     if (!decoder.decode(cookie.created))
137         return std::nullopt;
138     if (!decoder.decode(cookie.expires))
139         return std::nullopt;
140     if (!decoder.decode(cookie.httpOnly))
141         return std::nullopt;
142     if (!decoder.decode(cookie.secure))
143         return std::nullopt;
144     if (!decoder.decode(cookie.session))
145         return std::nullopt;
146     if (!decoder.decode(cookie.comment))
147         return std::nullopt;
148     if (!decoder.decode(cookie.commentURL))
149         return std::nullopt;
150     if (!decoder.decode(cookie.ports))
151         return std::nullopt;
152     if (!decoder.decode(cookie.sameSite))
153         return std::nullopt;
154     return cookie;
155 }
156
157 }
158
159 namespace WTF {
160     template<typename T> struct DefaultHash;
161     template<> struct DefaultHash<WebCore::Cookie> {
162         typedef WebCore::CookieHash Hash;
163     };
164     template<> struct HashTraits<WebCore::Cookie> : GenericHashTraits<WebCore::Cookie> {
165         static WebCore::Cookie emptyValue() { return { }; }
166         static void constructDeletedValue(WebCore::Cookie& slot) { slot = WebCore::Cookie(WTF::HashTableDeletedValue); }
167         static bool isDeletedValue(const WebCore::Cookie& slot) { return slot.name.isHashTableDeletedValue(); }
168     };
169     template<> struct EnumTraits<WebCore::Cookie::SameSitePolicy> {
170     using values = EnumValues<
171         WebCore::Cookie::SameSitePolicy,
172         WebCore::Cookie::SameSitePolicy::None,
173         WebCore::Cookie::SameSitePolicy::Lax,
174         WebCore::Cookie::SameSitePolicy::Strict
175     >;
176 };
177 }