2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
3 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4 * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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.
15 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.
28 #ifndef ResourceRequest_h
29 #define ResourceRequest_h
31 #include "platform/network/FormData.h"
32 #include "platform/network/HTTPHeaderMap.h"
33 #include "platform/network/HTTPParsers.h"
34 #include "platform/network/ResourceLoadPriority.h"
35 #include "platform/weborigin/KURL.h"
36 #include "platform/weborigin/Referrer.h"
37 #include "public/platform/WebURLRequest.h"
38 #include "wtf/OwnPtr.h"
42 enum ResourceRequestCachePolicy {
43 UseProtocolCachePolicy, // normal load
44 ReloadIgnoringCacheData, // reload
45 ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data
46 ReturnCacheDataDontLoad, // results of a post - allow stale data and only use cache
47 ReloadBypassingCache, // end-to-end reload
50 struct CrossThreadResourceRequestData;
52 class PLATFORM_EXPORT ResourceRequest {
53 WTF_MAKE_FAST_ALLOCATED;
55 class ExtraData : public RefCounted<ExtraData> {
57 virtual ~ExtraData() { }
65 ResourceRequest(const String& urlString)
67 initialize(KURL(ParsedURLString, urlString));
70 ResourceRequest(const KURL& url)
75 static PassOwnPtr<ResourceRequest> adopt(PassOwnPtr<CrossThreadResourceRequestData>);
77 // Gets a copy of the data suitable for passing to another thread.
78 PassOwnPtr<CrossThreadResourceRequestData> copyData() const;
83 const KURL& url() const;
84 void setURL(const KURL& url);
86 void removeCredentials();
88 ResourceRequestCachePolicy cachePolicy() const;
89 void setCachePolicy(ResourceRequestCachePolicy cachePolicy);
91 double timeoutInterval() const; // May return 0 when using platform default.
92 void setTimeoutInterval(double timeoutInterval);
94 const KURL& firstPartyForCookies() const;
95 void setFirstPartyForCookies(const KURL& firstPartyForCookies);
97 const AtomicString& httpMethod() const;
98 void setHTTPMethod(const AtomicString&);
100 const HTTPHeaderMap& httpHeaderFields() const;
101 const AtomicString& httpHeaderField(const AtomicString& name) const;
102 const AtomicString& httpHeaderField(const char* name) const;
103 void setHTTPHeaderField(const AtomicString& name, const AtomicString& value);
104 void setHTTPHeaderField(const char* name, const AtomicString& value);
105 void addHTTPHeaderField(const AtomicString& name, const AtomicString& value);
106 void addHTTPHeaderFields(const HTTPHeaderMap& headerFields);
107 void clearHTTPHeaderField(const AtomicString& name);
109 void clearHTTPAuthorization();
111 const AtomicString& httpContentType() const { return httpHeaderField("Content-Type"); }
112 void setHTTPContentType(const AtomicString& httpContentType) { setHTTPHeaderField("Content-Type", httpContentType); }
114 const AtomicString& httpReferrer() const { return httpHeaderField("Referer"); }
115 ReferrerPolicy referrerPolicy() const { return m_referrerPolicy; }
116 void setHTTPReferrer(const Referrer&);
117 void clearHTTPReferrer();
119 const AtomicString& httpOrigin() const { return httpHeaderField("Origin"); }
120 void setHTTPOrigin(const AtomicString& httpOrigin) { setHTTPHeaderField("Origin", httpOrigin); }
121 void clearHTTPOrigin();
122 void addHTTPOriginIfNeeded(const AtomicString& origin);
124 const AtomicString& httpUserAgent() const { return httpHeaderField("User-Agent"); }
125 void setHTTPUserAgent(const AtomicString& httpUserAgent) { setHTTPHeaderField("User-Agent", httpUserAgent); }
126 void clearHTTPUserAgent();
128 const AtomicString& httpAccept() const { return httpHeaderField("Accept"); }
129 void setHTTPAccept(const AtomicString& httpAccept) { setHTTPHeaderField("Accept", httpAccept); }
131 FormData* httpBody() const;
132 void setHTTPBody(PassRefPtr<FormData> httpBody);
134 bool allowStoredCredentials() const;
135 void setAllowStoredCredentials(bool allowCredentials);
137 ResourceLoadPriority priority() const;
138 void setPriority(ResourceLoadPriority, int intraPriorityValue = 0);
140 bool isConditional() const;
142 // Whether the associated ResourceHandleClient needs to be notified of
143 // upload progress made for that resource.
144 bool reportUploadProgress() const { return m_reportUploadProgress; }
145 void setReportUploadProgress(bool reportUploadProgress) { m_reportUploadProgress = reportUploadProgress; }
147 // Whether actual headers being sent/received should be collected and reported for the request.
148 bool reportRawHeaders() const { return m_reportRawHeaders; }
149 void setReportRawHeaders(bool reportRawHeaders) { m_reportRawHeaders = reportRawHeaders; }
151 // Allows the request to be matched up with its requestor.
152 int requestorID() const { return m_requestorID; }
153 void setRequestorID(int requestorID) { m_requestorID = requestorID; }
155 // The process id of the process from which this request originated. In
156 // the case of out-of-process plugins, this allows to link back the
157 // request to the plugin process (as it is processed through a render
159 int requestorProcessID() const { return m_requestorProcessID; }
160 void setRequestorProcessID(int requestorProcessID) { m_requestorProcessID = requestorProcessID; }
162 // Allows the request to be matched up with its app cache host.
163 int appCacheHostID() const { return m_appCacheHostID; }
164 void setAppCacheHostID(int id) { m_appCacheHostID = id; }
166 // True if request was user initiated.
167 bool hasUserGesture() const { return m_hasUserGesture; }
168 void setHasUserGesture(bool hasUserGesture) { m_hasUserGesture = hasUserGesture; }
170 // True if request should be downloaded to file.
171 bool downloadToFile() const { return m_downloadToFile; }
172 void setDownloadToFile(bool downloadToFile) { m_downloadToFile = downloadToFile; }
174 // True if the request should not be handled by the ServiceWorker.
175 bool skipServiceWorker() const { return m_skipServiceWorker; }
176 void setSkipServiceWorker(bool skipServiceWorker) { m_skipServiceWorker = skipServiceWorker; }
178 // Extra data associated with this request.
179 ExtraData* extraData() const { return m_extraData.get(); }
180 void setExtraData(PassRefPtr<ExtraData> extraData) { m_extraData = extraData; }
182 WebURLRequest::RequestContext requestContext() const { return m_requestContext; }
183 void setRequestContext(WebURLRequest::RequestContext context) { m_requestContext = context; }
185 WebURLRequest::FrameType frameType() const { return m_frameType; }
186 void setFrameType(WebURLRequest::FrameType frameType) { m_frameType = frameType; }
188 WebURLRequest::FetchRequestMode fetchRequestMode() const { return m_fetchRequestMode; }
189 void setFetchRequestMode(WebURLRequest::FetchRequestMode mode) { m_fetchRequestMode = mode; }
191 WebURLRequest::FetchCredentialsMode fetchCredentialsMode() const { return m_fetchCredentialsMode; }
192 void setFetchCredentialsMode(WebURLRequest::FetchCredentialsMode mode) { m_fetchCredentialsMode = mode; }
194 bool cacheControlContainsNoCache() const;
195 bool cacheControlContainsNoStore() const;
196 bool hasCacheValidatorFields() const;
198 static double defaultTimeoutInterval(); // May return 0 when using platform default.
199 static void setDefaultTimeoutInterval(double);
201 static bool compare(const ResourceRequest&, const ResourceRequest&);
204 void initialize(const KURL&);
206 const CacheControlHeader& cacheControlHeader() const;
209 ResourceRequestCachePolicy m_cachePolicy;
210 double m_timeoutInterval; // 0 is a magic value for platform default on platforms that have one.
211 KURL m_firstPartyForCookies;
212 AtomicString m_httpMethod;
213 HTTPHeaderMap m_httpHeaderFields;
214 RefPtr<FormData> m_httpBody;
215 bool m_allowStoredCredentials : 1;
216 bool m_reportUploadProgress : 1;
217 bool m_reportRawHeaders : 1;
218 bool m_hasUserGesture : 1;
219 bool m_downloadToFile : 1;
220 bool m_skipServiceWorker : 1;
221 ResourceLoadPriority m_priority;
222 int m_intraPriorityValue;
224 int m_requestorProcessID;
225 int m_appCacheHostID;
226 RefPtr<ExtraData> m_extraData;
227 WebURLRequest::RequestContext m_requestContext;
228 WebURLRequest::FrameType m_frameType;
229 WebURLRequest::FetchRequestMode m_fetchRequestMode;
230 WebURLRequest::FetchCredentialsMode m_fetchCredentialsMode;
231 ReferrerPolicy m_referrerPolicy;
233 mutable CacheControlHeader m_cacheControlHeaderCache;
235 static double s_defaultTimeoutInterval;
238 bool equalIgnoringHeaderFields(const ResourceRequest&, const ResourceRequest&);
240 inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequest::compare(a, b); }
241 inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); }
243 struct CrossThreadResourceRequestData {
244 WTF_MAKE_NONCOPYABLE(CrossThreadResourceRequestData); WTF_MAKE_FAST_ALLOCATED;
246 CrossThreadResourceRequestData() { }
249 ResourceRequestCachePolicy m_cachePolicy;
250 double m_timeoutInterval;
251 KURL m_firstPartyForCookies;
254 OwnPtr<CrossThreadHTTPHeaderMapData> m_httpHeaders;
255 RefPtr<FormData> m_httpBody;
256 bool m_allowStoredCredentials;
257 bool m_reportUploadProgress;
258 bool m_hasUserGesture;
259 bool m_downloadToFile;
260 bool m_skipServiceWorker;
261 ResourceLoadPriority m_priority;
262 int m_intraPriorityValue;
264 int m_requestorProcessID;
265 int m_appCacheHostID;
266 WebURLRequest::RequestContext m_requestContext;
267 WebURLRequest::FrameType m_frameType;
268 WebURLRequest::FetchRequestMode m_fetchRequestMode;
269 WebURLRequest::FetchCredentialsMode m_fetchCredentialsMode;
270 ReferrerPolicy m_referrerPolicy;
273 unsigned initializeMaximumHTTPConnectionCountPerHost();
277 #endif // ResourceRequest_h