Drop ResourceLoadPriorityUnresolved resource load priority and use Optional<> instead
[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
40         ReloadIgnoringCacheData, // reload
41         ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data
42         ReturnCacheDataDontLoad  // results of a post - allow stale data and only use cache
43     };
44
45     enum HTTPBodyUpdatePolicy {
46         DoNotUpdateHTTPBody,
47         UpdateHTTPBody
48     };
49
50     class ResourceRequest;
51     struct CrossThreadResourceRequestData;
52
53     // Do not use this type directly.  Use ResourceRequest instead.
54     class ResourceRequestBase {
55         WTF_MAKE_FAST_ALLOCATED;
56     public:
57         static PassOwnPtr<ResourceRequest> adopt(PassOwnPtr<CrossThreadResourceRequestData>);
58
59         // Gets a copy of the data suitable for passing to another thread.
60         PassOwnPtr<CrossThreadResourceRequestData> copyData() const;
61
62         WEBCORE_EXPORT bool isNull() const;
63         WEBCORE_EXPORT bool isEmpty() const;
64
65         WEBCORE_EXPORT const URL& url() const;
66         WEBCORE_EXPORT void setURL(const URL& url);
67
68         void removeCredentials();
69
70         ResourceRequestCachePolicy cachePolicy() const;
71         WEBCORE_EXPORT void setCachePolicy(ResourceRequestCachePolicy cachePolicy);
72         
73         double timeoutInterval() const; // May return 0 when using platform default.
74         void setTimeoutInterval(double timeoutInterval);
75         
76         WEBCORE_EXPORT const URL& firstPartyForCookies() const;
77         void setFirstPartyForCookies(const URL& firstPartyForCookies);
78         
79         WEBCORE_EXPORT const String& httpMethod() const;
80         WEBCORE_EXPORT void setHTTPMethod(const String& httpMethod);
81         
82         const HTTPHeaderMap& httpHeaderFields() const;
83         WEBCORE_EXPORT void setHTTPHeaderFields(HTTPHeaderMap);
84
85         String httpHeaderField(const String& name) const;
86         String httpHeaderField(HTTPHeaderName) const;
87         void setHTTPHeaderField(const String& name, const String& value);
88         void setHTTPHeaderField(HTTPHeaderName, const String& value);
89         void addHTTPHeaderField(const String& name, const String& value);
90
91         // Instead of passing a string literal to any of these functions, just use a HTTPHeaderName instead.
92         template<size_t length> String httpHeaderField(const char (&)[length]) const = delete;
93         template<size_t length> void setHTTPHeaderField(const char (&)[length], const String&) = delete;
94         template<size_t length> void addHTTPHeaderField(const char (&)[length], const String&) = delete;
95
96         void clearHTTPAuthorization();
97
98         WEBCORE_EXPORT String httpContentType() const;
99         WEBCORE_EXPORT void setHTTPContentType(const String&);
100         void clearHTTPContentType();
101
102         String httpReferrer() const;
103         WEBCORE_EXPORT void setHTTPReferrer(const String&);
104         void clearHTTPReferrer();
105         
106         String httpOrigin() const;
107         void setHTTPOrigin(const String&);
108         void clearHTTPOrigin();
109
110         String httpUserAgent() const;
111         void setHTTPUserAgent(const String&);
112         void clearHTTPUserAgent();
113
114         String httpAccept() const;
115         void setHTTPAccept(const String&);
116         void clearHTTPAccept();
117
118         const Vector<String>& responseContentDispositionEncodingFallbackArray() const { return m_responseContentDispositionEncodingFallbackArray; }
119         WEBCORE_EXPORT void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String());
120
121         WEBCORE_EXPORT FormData* httpBody() const;
122         WEBCORE_EXPORT void setHTTPBody(PassRefPtr<FormData> httpBody);
123         
124         bool allowCookies() const;
125         void setAllowCookies(bool allowCookies);
126
127         WEBCORE_EXPORT ResourceLoadPriority priority() const;
128         WEBCORE_EXPORT void setPriority(ResourceLoadPriority);
129
130         bool isConditional() const;
131         void makeUnconditional();
132
133         // Whether the associated ResourceHandleClient needs to be notified of
134         // upload progress made for that resource.
135         bool reportUploadProgress() const { return m_reportUploadProgress; }
136         void setReportUploadProgress(bool reportUploadProgress) { m_reportUploadProgress = reportUploadProgress; }
137
138         // Whether the timing information should be collected for the request.
139         bool reportLoadTiming() const { return m_reportLoadTiming; }
140         void setReportLoadTiming(bool reportLoadTiming) { m_reportLoadTiming = reportLoadTiming; }
141
142         // Whether actual headers being sent/received should be collected and reported for the request.
143         bool reportRawHeaders() const { return m_reportRawHeaders; }
144         void setReportRawHeaders(bool reportRawHeaders) { m_reportRawHeaders = reportRawHeaders; }
145
146         // Whether this request should be hidden from the Inspector.
147         bool hiddenFromInspector() const { return m_hiddenFromInspector; }
148         void setHiddenFromInspector(bool hiddenFromInspector) { m_hiddenFromInspector = hiddenFromInspector; }
149
150 #if !PLATFORM(COCOA)
151         bool encodingRequiresPlatformData() const { return true; }
152 #endif
153         template<class Encoder> void encodeWithoutPlatformData(Encoder&) const;
154         template<class Decoder> bool decodeWithoutPlatformData(Decoder&);
155
156         WEBCORE_EXPORT static double defaultTimeoutInterval(); // May return 0 when using platform default.
157         WEBCORE_EXPORT static void setDefaultTimeoutInterval(double);
158
159 #if PLATFORM(IOS)
160         WEBCORE_EXPORT static bool defaultAllowCookies();
161         WEBCORE_EXPORT static void setDefaultAllowCookies(bool);
162 #endif
163
164         static bool compare(const ResourceRequest&, const ResourceRequest&);
165
166     protected:
167         // Used when ResourceRequest is initialized from a platform representation of the request
168         ResourceRequestBase()
169             : m_resourceRequestUpdated(false)
170             , m_platformRequestUpdated(true)
171             , m_resourceRequestBodyUpdated(false)
172             , m_platformRequestBodyUpdated(true)
173             , m_reportUploadProgress(false)
174             , m_reportLoadTiming(false)
175             , m_reportRawHeaders(false)
176             , m_hiddenFromInspector(false)
177             , m_priority(ResourceLoadPriorityLow)
178         {
179         }
180
181         ResourceRequestBase(const URL& url, ResourceRequestCachePolicy policy)
182             : m_url(url)
183             , m_timeoutInterval(s_defaultTimeoutInterval)
184             , m_httpMethod(ASCIILiteral("GET"))
185             , m_cachePolicy(policy)
186 #if !PLATFORM(IOS)
187             , m_allowCookies(true)
188 #else
189             , m_allowCookies(ResourceRequestBase::defaultAllowCookies())
190 #endif
191             , m_resourceRequestUpdated(true)
192             , m_platformRequestUpdated(false)
193             , m_resourceRequestBodyUpdated(true)
194             , m_platformRequestBodyUpdated(false)
195             , m_reportUploadProgress(false)
196             , m_reportLoadTiming(false)
197             , m_reportRawHeaders(false)
198             , m_hiddenFromInspector(false)
199             , m_priority(ResourceLoadPriorityLow)
200         {
201         }
202
203         void updatePlatformRequest(HTTPBodyUpdatePolicy = DoNotUpdateHTTPBody) const;
204         void updateResourceRequest(HTTPBodyUpdatePolicy = DoNotUpdateHTTPBody) const;
205
206         // The ResourceRequest subclass may "shadow" this method to compare platform specific fields
207         static bool platformCompare(const ResourceRequest&, const ResourceRequest&) { return true; }
208
209         URL m_url;
210         double m_timeoutInterval; // 0 is a magic value for platform default on platforms that have one.
211         URL m_firstPartyForCookies;
212         String m_httpMethod;
213         HTTPHeaderMap m_httpHeaderFields;
214         Vector<String> m_responseContentDispositionEncodingFallbackArray;
215         RefPtr<FormData> m_httpBody;
216         unsigned m_cachePolicy : 3;
217         unsigned m_allowCookies : 1;
218         mutable unsigned m_resourceRequestUpdated : 1;
219         mutable unsigned m_platformRequestUpdated : 1;
220         mutable unsigned m_resourceRequestBodyUpdated : 1;
221         mutable unsigned m_platformRequestBodyUpdated : 1;
222         unsigned m_reportUploadProgress : 1;
223         unsigned m_reportLoadTiming : 1;
224         unsigned m_reportRawHeaders : 1;
225         unsigned m_hiddenFromInspector : 1;
226         unsigned m_priority : 4;
227
228     private:
229         const ResourceRequest& asResourceRequest() const;
230
231         WEBCORE_EXPORT static double s_defaultTimeoutInterval;
232 #if PLATFORM(IOS)
233         static bool s_defaultAllowCookies;
234 #endif
235     };
236
237     bool equalIgnoringHeaderFields(const ResourceRequestBase&, const ResourceRequestBase&);
238
239     inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequestBase::compare(a, b); }
240     inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); }
241
242     struct CrossThreadResourceRequestDataBase {
243         WTF_MAKE_NONCOPYABLE(CrossThreadResourceRequestDataBase); WTF_MAKE_FAST_ALLOCATED;
244     public:
245         CrossThreadResourceRequestDataBase() { }
246         URL m_url;
247
248         ResourceRequestCachePolicy m_cachePolicy;
249         double m_timeoutInterval;
250         URL m_firstPartyForCookies;
251
252         String m_httpMethod;
253         std::unique_ptr<CrossThreadHTTPHeaderMapData> m_httpHeaders;
254         Vector<String> m_responseContentDispositionEncodingFallbackArray;
255         RefPtr<FormData> m_httpBody;
256         bool m_allowCookies;
257         ResourceLoadPriority m_priority;
258     };
259     
260     unsigned initializeMaximumHTTPConnectionCountPerHost();
261 #if PLATFORM(IOS)
262     WEBCORE_EXPORT void initializeHTTPConnectionSettingsOnStartup();
263 #endif
264
265 template<class Encoder>
266 void ResourceRequestBase::encodeWithoutPlatformData(Encoder& encoder) const
267 {
268     ASSERT(!m_httpBody);
269     ASSERT(!m_platformRequestUpdated);
270     encoder << m_url.string();
271     encoder << m_timeoutInterval;
272     encoder << m_firstPartyForCookies.string();
273     encoder << m_httpMethod;
274     encoder << m_httpHeaderFields;
275     encoder << m_responseContentDispositionEncodingFallbackArray;
276     encoder.encodeEnum(m_cachePolicy);
277     encoder << m_allowCookies;
278     encoder.encodeEnum(m_priority);
279 }
280
281 template<class Decoder>
282 bool ResourceRequestBase::decodeWithoutPlatformData(Decoder& decoder)
283 {
284     String url;
285     if (!decoder.decode(url))
286         return false;
287     m_url = URL(ParsedURLString, url);
288
289     if (!decoder.decode(m_timeoutInterval))
290         return false;
291
292     String firstPartyForCookies;
293     if (!decoder.decode(firstPartyForCookies))
294         return false;
295     m_firstPartyForCookies = URL(ParsedURLString, firstPartyForCookies);
296
297     if (!decoder.decode(m_httpMethod))
298         return false;
299
300     if (!decoder.decode(m_httpHeaderFields))
301         return false;
302
303     if (!decoder.decode(m_responseContentDispositionEncodingFallbackArray))
304         return false;
305
306     ResourceRequestCachePolicy cachePolicy;
307     if (!decoder.decodeEnum(cachePolicy))
308         return false;
309     m_cachePolicy = cachePolicy;
310
311     bool allowCookies;
312     if (!decoder.decode(allowCookies))
313         return false;
314     m_allowCookies = allowCookies;
315
316     ResourceLoadPriority priority;
317     if (!decoder.decodeEnum(priority))
318         return false;
319     m_priority = priority;
320
321     return true;
322 }
323
324 } // namespace WebCore
325
326 #endif // ResourceRequestBase_h