Add optional logging of per-resource cookie information
[WebKit-https.git] / Source / WebCore / platform / Cookie.h
1 /*
2  * Copyright (C) 2009 Joseph Pecoraro. All rights reserved.
3  * Copyright (C) 2017 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 "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() { }
41     
42     Cookie(WTF::HashTableDeletedValueType)
43         : name(WTF::HashTableDeletedValue)
44     { }
45
46     Cookie(const String& name, const String& value, const String& domain, const String& path, double created, double expires, bool httpOnly, bool secure, bool session, const String& comment, const URL& commentURL, const Vector<uint16_t> ports)
47         : name(name)
48         , value(value)
49         , domain(domain)
50         , path(path)
51         , created(created)
52         , expires(expires)
53         , httpOnly(httpOnly)
54         , secure(secure)
55         , session(session)
56         , comment(comment)
57         , commentURL(commentURL)
58         , ports(ports)
59     {
60     }
61
62     template<class Encoder> void encode(Encoder&) const;
63     template<class Decoder> static std::optional<Cookie> decode(Decoder&);
64
65     WEBCORE_EXPORT bool operator==(const Cookie&) const;
66     WEBCORE_EXPORT unsigned hash() const;
67
68 #ifdef __OBJC__
69     WEBCORE_EXPORT Cookie(NSHTTPCookie *);
70     WEBCORE_EXPORT operator NSHTTPCookie *() const;
71 #elif USE(SOUP)
72     explicit Cookie(SoupCookie*);
73     SoupCookie* toSoupCookie() const;
74 #endif
75
76     bool isNull() const
77     {
78         return name.isNull()
79         && value.isNull()
80         && domain.isNull()
81         && path.isNull()
82         && created == 0
83         && expires == 0
84         && !httpOnly
85         && !secure
86         && !session
87         && comment.isNull()
88         && commentURL.isNull();
89     }
90     
91     String name;
92     String value;
93     String domain;
94     String path;
95     // Creation and expiration dates are expressed as milliseconds since the UNIX epoch.
96     double created { 0 };
97     double expires { 0 };
98     bool httpOnly { false };
99     bool secure { false };
100     bool session { false };
101     String comment;
102     URL commentURL;
103     Vector<uint16_t> ports;
104 };
105
106 struct CookieHash {
107     static unsigned hash(const Cookie& key)
108     {
109         return key.hash();
110     }
111
112     static bool equal(const Cookie& a, const Cookie& b)
113     {
114         return a == b;
115     }
116     static const bool safeToCompareToEmptyOrDeleted = false;
117 };
118
119 template<class Encoder>
120 void Cookie::encode(Encoder& encoder) const
121 {
122     encoder << name << value << domain << path << created << expires << httpOnly << secure << session << comment << commentURL << ports;
123 }
124
125 template<class Decoder>
126 std::optional<Cookie> Cookie::decode(Decoder& decoder)
127 {
128     std::optional<String> name;
129     decoder >> name;
130     if (!name)
131         return std::nullopt;
132     
133     std::optional<String> value;
134     decoder >> value;
135     if (!value)
136         return std::nullopt;
137
138     std::optional<String> domain;
139     decoder >> domain;
140     if (!domain)
141         return std::nullopt;
142
143     std::optional<String> path;
144     decoder >> path;
145     if (!path)
146         return std::nullopt;
147
148     std::optional<double> created;
149     decoder >> created;
150     if (!created)
151         return std::nullopt;
152
153     std::optional<double> expires;
154     decoder >> expires;
155     if (!expires)
156         return std::nullopt;
157
158     std::optional<bool> httpOnly;
159     decoder >> httpOnly;
160     if (!httpOnly)
161         return std::nullopt;
162
163     std::optional<bool> secure;
164     decoder >> secure;
165     if (!secure)
166         return std::nullopt;
167
168     std::optional<bool> session;
169     decoder >> session;
170     if (!session)
171         return std::nullopt;
172
173     std::optional<String> comment;
174     decoder >> comment;
175     if (!comment)
176         return std::nullopt;
177
178     URL commentURL;
179     if (!decoder.decode(commentURL))
180         return std::nullopt;
181
182     std::optional<Vector<uint16_t>> ports;
183     decoder >> ports;
184     if (!ports)
185         return std::nullopt;
186
187     return {{ WTFMove(*name), WTFMove(*value), WTFMove(*domain), WTFMove(*path), WTFMove(*created), WTFMove(*expires), WTFMove(*httpOnly), WTFMove(*secure), WTFMove(*session), WTFMove(*comment), WTFMove(commentURL), WTFMove(*ports) }};
188 }
189
190 }
191
192 namespace WTF {
193     template<typename T> struct DefaultHash;
194     template<> struct DefaultHash<WebCore::Cookie> {
195         typedef WebCore::CookieHash Hash;
196     };
197     template<> struct HashTraits<WebCore::Cookie> : GenericHashTraits<WebCore::Cookie> {
198         static WebCore::Cookie emptyValue() { return { }; }
199         static void constructDeletedValue(WebCore::Cookie& slot) { slot = WebCore::Cookie(WTF::HashTableDeletedValue); }
200         static bool isDeletedValue(const WebCore::Cookie& slot) { return slot.name.isHashTableDeletedValue(); }
201     };
202 }