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