Drop non-const getter for CachedResource::resourceRequest()
[WebKit-https.git] / Source / WebCore / platform / network / ResourceRequestBase.h
1 /*
2  * Copyright (C) 2003, 2006 Apple Inc.  All rights reserved.
3  * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4  * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #ifndef ResourceRequestBase_h
29 #define ResourceRequestBase_h
30
31 #include "FormData.h"
32 #include "HTTPHeaderMap.h"
33 #include "URL.h"
34 #include "ResourceLoadPriority.h"
35
36 namespace WebCore {
37
38 enum ResourceRequestCachePolicy {
39     UseProtocolCachePolicy, // normal load, equivalent to fetch "default" cache mode.
40     ReloadIgnoringCacheData, // reload, equivalent to fetch "reload"cache mode.
41     ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data, equivalent to fetch "force-cache" cache mode.
42     ReturnCacheDataDontLoad, // results of a post - allow stale data and only use cache, equivalent to fetch "only-if-cached" cache mode.
43     DoNotUseAnyCache, // Bypass the cache entirely, equivalent to fetch "no-store" cache mode.
44     RefreshAnyCacheData, // Serve cache data only if revalidated, equivalent to fetch "no-cache" mode.
45 };
46
47 enum HTTPBodyUpdatePolicy {
48     DoNotUpdateHTTPBody,
49     UpdateHTTPBody
50 };
51
52 class ResourceRequest;
53
54 // Do not use this type directly.  Use ResourceRequest instead.
55 class ResourceRequestBase {
56     WTF_MAKE_FAST_ALLOCATED;
57 public:
58     ResourceRequest isolatedCopy() const;
59     WEBCORE_EXPORT void setAsIsolatedCopy(const ResourceRequest&);
60
61     WEBCORE_EXPORT bool isNull() const;
62     WEBCORE_EXPORT bool isEmpty() const;
63
64     WEBCORE_EXPORT const URL& url() const;
65     WEBCORE_EXPORT void setURL(const URL& url);
66
67     WEBCORE_EXPORT void removeCredentials();
68
69     WEBCORE_EXPORT ResourceRequestCachePolicy cachePolicy() const;
70     WEBCORE_EXPORT void setCachePolicy(ResourceRequestCachePolicy cachePolicy);
71     
72     double timeoutInterval() const; // May return 0 when using platform default.
73     void setTimeoutInterval(double timeoutInterval);
74     
75     WEBCORE_EXPORT const URL& firstPartyForCookies() const;
76     WEBCORE_EXPORT void setFirstPartyForCookies(const URL&);
77     
78     WEBCORE_EXPORT const String& httpMethod() const;
79     WEBCORE_EXPORT void setHTTPMethod(const String& httpMethod);
80     
81     WEBCORE_EXPORT const HTTPHeaderMap& httpHeaderFields() const;
82     WEBCORE_EXPORT void setHTTPHeaderFields(HTTPHeaderMap);
83
84     WEBCORE_EXPORT String httpHeaderField(const String& name) const;
85     WEBCORE_EXPORT String httpHeaderField(HTTPHeaderName) const;
86     WEBCORE_EXPORT void setHTTPHeaderField(const String& name, const String& value);
87     WEBCORE_EXPORT void setHTTPHeaderField(HTTPHeaderName, const String& value);
88     void addHTTPHeaderField(HTTPHeaderName, const String& value);
89     void addHTTPHeaderField(const String& name, const String& value);
90     void addHTTPHeaderFieldIfNotPresent(HTTPHeaderName, const String&);
91
92     bool hasHTTPHeaderField(HTTPHeaderName) const;
93
94     // Instead of passing a string literal to any of these functions, just use a HTTPHeaderName instead.
95     template<size_t length> String httpHeaderField(const char (&)[length]) const = delete;
96     template<size_t length> void setHTTPHeaderField(const char (&)[length], const String&) = delete;
97     template<size_t length> void addHTTPHeaderField(const char (&)[length], const String&) = delete;
98
99     WEBCORE_EXPORT void clearHTTPAuthorization();
100
101     WEBCORE_EXPORT String httpContentType() const;
102     WEBCORE_EXPORT void setHTTPContentType(const String&);
103     void clearHTTPContentType();
104
105     bool hasHTTPHeader(HTTPHeaderName) const;
106
107     WEBCORE_EXPORT String httpReferrer() const;
108     bool hasHTTPReferrer() const;
109     WEBCORE_EXPORT void setHTTPReferrer(const String&);
110     WEBCORE_EXPORT void clearHTTPReferrer();
111
112     String httpOrigin() const;
113     bool hasHTTPOrigin() const;
114     void setHTTPOrigin(const String&);
115     WEBCORE_EXPORT void clearHTTPOrigin();
116
117     WEBCORE_EXPORT String httpUserAgent() const;
118     WEBCORE_EXPORT void setHTTPUserAgent(const String&);
119     void clearHTTPUserAgent();
120
121     String httpAccept() const;
122     void setHTTPAccept(const String&);
123     void clearHTTPAccept();
124
125     void clearHTTPAcceptEncoding();
126
127     const Vector<String>& responseContentDispositionEncodingFallbackArray() const { return m_responseContentDispositionEncodingFallbackArray; }
128     WEBCORE_EXPORT void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String());
129
130     WEBCORE_EXPORT FormData* httpBody() const;
131     WEBCORE_EXPORT void setHTTPBody(RefPtr<FormData>&&);
132
133     bool allowCookies() const;
134     void setAllowCookies(bool allowCookies);
135
136     WEBCORE_EXPORT ResourceLoadPriority priority() const;
137     WEBCORE_EXPORT void setPriority(ResourceLoadPriority);
138
139     WEBCORE_EXPORT static String partitionName(const String& domain);
140     const String& cachePartition() const { return m_cachePartition; }
141     WEBCORE_EXPORT void setCachePartition(const String&);
142     void setDomainForCachePartition(const String& domain) { setCachePartition(partitionName(domain)); }
143
144     WEBCORE_EXPORT bool isConditional() const;
145     WEBCORE_EXPORT void makeUnconditional();
146
147     // Whether this request should be hidden from the Inspector.
148     bool hiddenFromInspector() const { return m_hiddenFromInspector; }
149     void setHiddenFromInspector(bool hiddenFromInspector) { m_hiddenFromInspector = hiddenFromInspector; }
150
151     enum class Requester { Unspecified, Main, XHR, Fetch, Media };
152     Requester requester() const { return m_requester; }
153     void setRequester(Requester requester) { m_requester = requester; }
154
155     // Who initiated the request so the Inspector can associate it with a context. E.g. a Web Worker.
156     String initiatorIdentifier() const { return m_initiatorIdentifier; }
157     void setInitiatorIdentifier(const String& identifier) { m_initiatorIdentifier = identifier; }
158
159 #if !PLATFORM(COCOA)
160     bool encodingRequiresPlatformData() const { return true; }
161 #endif
162     template<class Encoder> void encodeWithoutPlatformData(Encoder&) const;
163     template<class Decoder> bool decodeWithoutPlatformData(Decoder&);
164
165     WEBCORE_EXPORT static double defaultTimeoutInterval(); // May return 0 when using platform default.
166     WEBCORE_EXPORT static void setDefaultTimeoutInterval(double);
167
168 #if PLATFORM(IOS)
169     WEBCORE_EXPORT static bool defaultAllowCookies();
170     WEBCORE_EXPORT static void setDefaultAllowCookies(bool);
171 #endif
172
173     static bool compare(const ResourceRequest&, const ResourceRequest&);
174
175 protected:
176     // Used when ResourceRequest is initialized from a platform representation of the request
177     ResourceRequestBase()
178         : m_platformRequestUpdated(true)
179         , m_platformRequestBodyUpdated(true)
180     {
181     }
182
183     ResourceRequestBase(const URL& url, ResourceRequestCachePolicy policy)
184         : m_url(url)
185         , m_timeoutInterval(s_defaultTimeoutInterval)
186         , m_httpMethod(ASCIILiteral("GET"))
187         , m_cachePolicy(policy)
188 #if !PLATFORM(IOS)
189         , m_allowCookies(true)
190 #else
191         , m_allowCookies(ResourceRequestBase::defaultAllowCookies())
192 #endif
193         , m_resourceRequestUpdated(true)
194         , m_resourceRequestBodyUpdated(true)
195     {
196     }
197
198     void updatePlatformRequest(HTTPBodyUpdatePolicy = DoNotUpdateHTTPBody) const;
199     void updateResourceRequest(HTTPBodyUpdatePolicy = DoNotUpdateHTTPBody) const;
200
201     template<class Encoder> void encodeBase(Encoder&) const;
202     template<class Decoder> bool decodeBase(Decoder&);
203
204     // The ResourceRequest subclass may "shadow" this method to compare platform specific fields
205     static bool platformCompare(const ResourceRequest&, const ResourceRequest&) { return true; }
206
207     URL m_url;
208     double m_timeoutInterval; // 0 is a magic value for platform default on platforms that have one.
209     URL m_firstPartyForCookies;
210     String m_httpMethod;
211     HTTPHeaderMap m_httpHeaderFields;
212     Vector<String> m_responseContentDispositionEncodingFallbackArray;
213     RefPtr<FormData> m_httpBody;
214     ResourceRequestCachePolicy m_cachePolicy { UseProtocolCachePolicy };
215     bool m_allowCookies { false };
216     mutable bool m_resourceRequestUpdated { false };
217     mutable bool m_platformRequestUpdated { false };
218     mutable bool m_resourceRequestBodyUpdated { false };
219     mutable bool m_platformRequestBodyUpdated { false };
220     bool m_hiddenFromInspector { false };
221     ResourceLoadPriority m_priority { ResourceLoadPriority::Low };
222     Requester m_requester { Requester::Unspecified };
223     String m_initiatorIdentifier;
224     String m_cachePartition { emptyString() };
225
226 private:
227     const ResourceRequest& asResourceRequest() const;
228
229     WEBCORE_EXPORT static double s_defaultTimeoutInterval;
230 #if PLATFORM(IOS)
231     static bool s_defaultAllowCookies;
232 #endif
233 };
234
235 bool equalIgnoringHeaderFields(const ResourceRequestBase&, const ResourceRequestBase&);
236
237 inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequestBase::compare(a, b); }
238 inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); }
239
240 WEBCORE_EXPORT unsigned initializeMaximumHTTPConnectionCountPerHost();
241 #if PLATFORM(IOS)
242 WEBCORE_EXPORT void initializeHTTPConnectionSettingsOnStartup();
243 #endif
244
245 template<class Encoder>
246 ALWAYS_INLINE void ResourceRequestBase::encodeBase(Encoder& encoder) const
247 {
248     encoder << m_url;
249     encoder << m_timeoutInterval;
250     encoder << m_firstPartyForCookies.string();
251     encoder << m_httpMethod;
252     encoder << m_httpHeaderFields;
253     encoder << m_responseContentDispositionEncodingFallbackArray;
254     encoder.encodeEnum(m_cachePolicy);
255     encoder << m_allowCookies;
256     encoder.encodeEnum(m_priority);
257     encoder.encodeEnum(m_requester);
258 }
259
260 template<class Decoder>
261 ALWAYS_INLINE bool ResourceRequestBase::decodeBase(Decoder& decoder)
262 {
263     if (!decoder.decode(m_url))
264         return false;
265
266     if (!decoder.decode(m_timeoutInterval))
267         return false;
268
269     String firstPartyForCookies;
270     if (!decoder.decode(firstPartyForCookies))
271         return false;
272     m_firstPartyForCookies = URL(ParsedURLString, firstPartyForCookies);
273
274     if (!decoder.decode(m_httpMethod))
275         return false;
276
277     if (!decoder.decode(m_httpHeaderFields))
278         return false;
279
280     if (!decoder.decode(m_responseContentDispositionEncodingFallbackArray))
281         return false;
282
283     ResourceRequestCachePolicy cachePolicy;
284     if (!decoder.decodeEnum(cachePolicy))
285         return false;
286     m_cachePolicy = cachePolicy;
287
288     bool allowCookies;
289     if (!decoder.decode(allowCookies))
290         return false;
291     m_allowCookies = allowCookies;
292
293     ResourceLoadPriority priority;
294     if (!decoder.decodeEnum(priority))
295         return false;
296     m_priority = priority;
297
298     if (!decoder.decodeEnum(m_requester))
299         return false;
300
301     return true;
302 }
303
304 template<class Encoder>
305 void ResourceRequestBase::encodeWithoutPlatformData(Encoder& encoder) const
306 {
307     ASSERT(!m_httpBody);
308     ASSERT(!m_platformRequestUpdated);
309     encodeBase(encoder);
310 }
311
312 template<class Decoder>
313 bool ResourceRequestBase::decodeWithoutPlatformData(Decoder& decoder)
314 {
315     return decodeBase(decoder);
316 }
317
318 } // namespace WebCore
319
320 #endif // ResourceRequestBase_h