2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
3 * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.
28 #include "platform/network/ResourceRequest.h"
32 double ResourceRequest::s_defaultTimeoutInterval = INT_MAX;
34 PassOwnPtr<ResourceRequest> ResourceRequest::adopt(PassOwnPtr<CrossThreadResourceRequestData> data)
36 OwnPtr<ResourceRequest> request = adoptPtr(new ResourceRequest());
37 request->setURL(data->m_url);
38 request->setCachePolicy(data->m_cachePolicy);
39 request->setTimeoutInterval(data->m_timeoutInterval);
40 request->setFirstPartyForCookies(data->m_firstPartyForCookies);
41 request->setHTTPMethod(AtomicString(data->m_httpMethod));
42 request->setPriority(data->m_priority);
44 request->m_httpHeaderFields.adopt(data->m_httpHeaders.release());
46 request->setHTTPBody(data->m_httpBody);
47 request->setAllowCookies(data->m_allowCookies);
48 request->setReportUploadProgress(data->m_reportUploadProgress);
49 request->setHasUserGesture(data->m_hasUserGesture);
50 request->setDownloadToFile(data->m_downloadToFile);
51 request->setRequestorID(data->m_requestorID);
52 request->setRequestorProcessID(data->m_requestorProcessID);
53 request->setAppCacheHostID(data->m_appCacheHostID);
54 request->setTargetType(data->m_targetType);
55 request->m_referrerPolicy = data->m_referrerPolicy;
56 return request.release();
59 PassOwnPtr<CrossThreadResourceRequestData> ResourceRequest::copyData() const
61 OwnPtr<CrossThreadResourceRequestData> data = adoptPtr(new CrossThreadResourceRequestData());
62 data->m_url = url().copy();
63 data->m_cachePolicy = cachePolicy();
64 data->m_timeoutInterval = timeoutInterval();
65 data->m_firstPartyForCookies = firstPartyForCookies().copy();
66 data->m_httpMethod = httpMethod().string().isolatedCopy();
67 data->m_httpHeaders = httpHeaderFields().copyData();
68 data->m_priority = priority();
71 data->m_httpBody = m_httpBody->deepCopy();
72 data->m_allowCookies = m_allowCookies;
73 data->m_reportUploadProgress = m_reportUploadProgress;
74 data->m_hasUserGesture = m_hasUserGesture;
75 data->m_downloadToFile = m_downloadToFile;
76 data->m_requestorID = m_requestorID;
77 data->m_requestorProcessID = m_requestorProcessID;
78 data->m_appCacheHostID = m_appCacheHostID;
79 data->m_targetType = m_targetType;
80 data->m_referrerPolicy = m_referrerPolicy;
81 return data.release();
84 bool ResourceRequest::isEmpty() const
86 return m_url.isEmpty();
89 bool ResourceRequest::isNull() const
91 return m_url.isNull();
94 const KURL& ResourceRequest::url() const
99 void ResourceRequest::setURL(const KURL& url)
104 void ResourceRequest::removeCredentials()
106 if (m_url.user().isEmpty() && m_url.pass().isEmpty())
109 m_url.setUser(String());
110 m_url.setPass(String());
113 ResourceRequestCachePolicy ResourceRequest::cachePolicy() const
115 return m_cachePolicy;
118 void ResourceRequest::setCachePolicy(ResourceRequestCachePolicy cachePolicy)
120 m_cachePolicy = cachePolicy;
123 double ResourceRequest::timeoutInterval() const
125 return m_timeoutInterval;
128 void ResourceRequest::setTimeoutInterval(double timeoutInterval)
130 m_timeoutInterval = timeoutInterval;
133 const KURL& ResourceRequest::firstPartyForCookies() const
135 return m_firstPartyForCookies;
138 void ResourceRequest::setFirstPartyForCookies(const KURL& firstPartyForCookies)
140 m_firstPartyForCookies = firstPartyForCookies;
143 const AtomicString& ResourceRequest::httpMethod() const
148 void ResourceRequest::setHTTPMethod(const AtomicString& httpMethod)
150 m_httpMethod = httpMethod;
153 const HTTPHeaderMap& ResourceRequest::httpHeaderFields() const
155 return m_httpHeaderFields;
158 const AtomicString& ResourceRequest::httpHeaderField(const AtomicString& name) const
160 return m_httpHeaderFields.get(name);
163 const AtomicString& ResourceRequest::httpHeaderField(const char* name) const
165 return m_httpHeaderFields.get(name);
168 void ResourceRequest::setHTTPHeaderField(const AtomicString& name, const AtomicString& value)
170 m_httpHeaderFields.set(name, value);
173 void ResourceRequest::setHTTPHeaderField(const char* name, const AtomicString& value)
175 setHTTPHeaderField(AtomicString(name), value);
178 void ResourceRequest::clearHTTPAuthorization()
180 m_httpHeaderFields.remove("Authorization");
183 void ResourceRequest::clearHTTPContentType()
185 m_httpHeaderFields.remove("Content-Type");
188 void ResourceRequest::clearHTTPReferrer()
190 m_httpHeaderFields.remove("Referer");
191 m_referrerPolicy = ReferrerPolicyDefault;
194 void ResourceRequest::clearHTTPOrigin()
196 m_httpHeaderFields.remove("Origin");
199 void ResourceRequest::clearHTTPUserAgent()
201 m_httpHeaderFields.remove("User-Agent");
204 void ResourceRequest::clearHTTPAccept()
206 m_httpHeaderFields.remove("Accept");
209 FormData* ResourceRequest::httpBody() const
211 return m_httpBody.get();
214 void ResourceRequest::setHTTPBody(PassRefPtr<FormData> httpBody)
216 m_httpBody = httpBody;
219 bool ResourceRequest::allowCookies() const
221 return m_allowCookies;
224 void ResourceRequest::setAllowCookies(bool allowCookies)
226 m_allowCookies = allowCookies;
229 ResourceLoadPriority ResourceRequest::priority() const
234 void ResourceRequest::setPriority(ResourceLoadPriority priority)
236 m_priority = priority;
239 void ResourceRequest::addHTTPHeaderField(const AtomicString& name, const AtomicString& value)
241 HTTPHeaderMap::AddResult result = m_httpHeaderFields.add(name, value);
242 if (!result.isNewEntry)
243 result.storedValue->value = result.storedValue->value + ',' + value;
246 void ResourceRequest::addHTTPHeaderFields(const HTTPHeaderMap& headerFields)
248 HTTPHeaderMap::const_iterator end = headerFields.end();
249 for (HTTPHeaderMap::const_iterator it = headerFields.begin(); it != end; ++it)
250 addHTTPHeaderField(it->key, it->value);
253 void ResourceRequest::clearHTTPHeaderField(const AtomicString& name)
255 m_httpHeaderFields.remove(name);
258 bool equalIgnoringHeaderFields(const ResourceRequest& a, const ResourceRequest& b)
260 if (a.url() != b.url())
263 if (a.cachePolicy() != b.cachePolicy())
266 if (a.timeoutInterval() != b.timeoutInterval())
269 if (a.firstPartyForCookies() != b.firstPartyForCookies())
272 if (a.httpMethod() != b.httpMethod())
275 if (a.allowCookies() != b.allowCookies())
278 if (a.priority() != b.priority())
281 if (a.referrerPolicy() != b.referrerPolicy())
284 FormData* formDataA = a.httpBody();
285 FormData* formDataB = b.httpBody();
292 if (*formDataA != *formDataB)
298 bool ResourceRequest::compare(const ResourceRequest& a, const ResourceRequest& b)
300 if (!equalIgnoringHeaderFields(a, b))
303 if (a.httpHeaderFields() != b.httpHeaderFields())
309 bool ResourceRequest::isConditional() const
311 return (m_httpHeaderFields.contains("If-Match")
312 || m_httpHeaderFields.contains("If-Modified-Since")
313 || m_httpHeaderFields.contains("If-None-Match")
314 || m_httpHeaderFields.contains("If-Range")
315 || m_httpHeaderFields.contains("If-Unmodified-Since")
316 || m_httpHeaderFields.contains("Cache-Control"));
319 double ResourceRequest::defaultTimeoutInterval()
321 return s_defaultTimeoutInterval;
324 void ResourceRequest::setDefaultTimeoutInterval(double timeoutInterval)
326 s_defaultTimeoutInterval = timeoutInterval;
329 void ResourceRequest::initialize(const KURL& url, ResourceRequestCachePolicy cachePolicy)
332 m_cachePolicy = cachePolicy;
333 m_timeoutInterval = s_defaultTimeoutInterval;
334 m_httpMethod = "GET";
335 m_allowCookies = true;
336 m_reportUploadProgress = false;
337 m_reportLoadTiming = false;
338 m_reportRawHeaders = false;
339 m_hasUserGesture = false;
340 m_downloadToFile = false;
341 m_priority = ResourceLoadPriorityLow;
343 m_requestorProcessID = 0;
344 m_appCacheHostID = 0;
345 m_targetType = TargetIsUnspecified;
346 m_referrerPolicy = ReferrerPolicyDefault;
349 // This is used by the loader to control the number of issued parallel load requests.
350 unsigned initializeMaximumHTTPConnectionCountPerHost()
352 // The chromium network stack already handles limiting the number of
353 // parallel requests per host, so there's no need to do it here. Therefore,
354 // this is set to a high value that should never be hit in practice.