<http://webkit.org/b/53192> Add experimental support for HTTP pipelining in CFNetwork
[WebKit-https.git] / Source / WebCore / platform / network / ResourceRequestBase.h
1 /*
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 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 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. 
26  */
27
28 #ifndef ResourceRequestBase_h
29 #define ResourceRequestBase_h
30
31 #include "FormData.h"
32 #include "HTTPHeaderMap.h"
33 #include "KURL.h"
34 #include "ResourceLoadPriority.h"
35
36 #include <wtf/OwnPtr.h>
37
38 namespace WebCore {
39
40     enum ResourceRequestCachePolicy {
41         UseProtocolCachePolicy, // normal load
42         ReloadIgnoringCacheData, // reload
43         ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data
44         ReturnCacheDataDontLoad, // results of a post - allow stale data and only use cache
45     };
46
47     const int unspecifiedTimeoutInterval = INT_MAX;
48
49     class ResourceRequest;
50     struct CrossThreadResourceRequestData;
51
52     // Do not use this type directly.  Use ResourceRequest instead.
53     class ResourceRequestBase {
54         WTF_MAKE_FAST_ALLOCATED;
55     public:
56         // The type of this ResourceRequest, based on how the resource will be used.
57         enum TargetType {
58             TargetIsMainFrame,
59             TargetIsSubframe,
60             TargetIsSubresource,  // Resource is a generic subresource.  (Generally a specific type should be specified)
61             TargetIsStyleSheet,
62             TargetIsScript,
63             TargetIsFontResource,
64             TargetIsImage,
65             TargetIsObject,
66             TargetIsMedia,
67             TargetIsWorker,
68             TargetIsSharedWorker,
69             TargetIsPrefetch,
70         };
71
72         static PassOwnPtr<ResourceRequest> adopt(PassOwnPtr<CrossThreadResourceRequestData>);
73
74         // Gets a copy of the data suitable for passing to another thread.
75         PassOwnPtr<CrossThreadResourceRequestData> copyData() const;
76
77         bool isNull() const;
78         bool isEmpty() const;
79
80         const KURL& url() const;
81         void setURL(const KURL& url);
82
83         void removeCredentials();
84
85         ResourceRequestCachePolicy cachePolicy() const;
86         void setCachePolicy(ResourceRequestCachePolicy cachePolicy);
87         
88         double timeoutInterval() const;
89         void setTimeoutInterval(double timeoutInterval);
90         
91         const KURL& firstPartyForCookies() const;
92         void setFirstPartyForCookies(const KURL& firstPartyForCookies);
93         
94         const String& httpMethod() const;
95         void setHTTPMethod(const String& httpMethod);
96         
97         const HTTPHeaderMap& httpHeaderFields() const;
98         String httpHeaderField(const AtomicString& name) const;
99         String httpHeaderField(const char* name) const;
100         void setHTTPHeaderField(const AtomicString& name, const String& value);
101         void setHTTPHeaderField(const char* name, const String& value);
102         void addHTTPHeaderField(const AtomicString& name, const String& value);
103         void addHTTPHeaderFields(const HTTPHeaderMap& headerFields);
104         
105         void clearHTTPAuthorization();
106
107         String httpContentType() const { return httpHeaderField("Content-Type");  }
108         void setHTTPContentType(const String& httpContentType) { setHTTPHeaderField("Content-Type", httpContentType); }
109         
110         String httpReferrer() const { return httpHeaderField("Referer"); }
111         void setHTTPReferrer(const String& httpReferrer) { setHTTPHeaderField("Referer", httpReferrer); }
112         void clearHTTPReferrer();
113         
114         String httpOrigin() const { return httpHeaderField("Origin"); }
115         void setHTTPOrigin(const String& httpOrigin) { setHTTPHeaderField("Origin", httpOrigin); }
116         void clearHTTPOrigin();
117
118         String httpUserAgent() const { return httpHeaderField("User-Agent"); }
119         void setHTTPUserAgent(const String& httpUserAgent) { setHTTPHeaderField("User-Agent", httpUserAgent); }
120
121         String httpAccept() const { return httpHeaderField("Accept"); }
122         void setHTTPAccept(const String& httpAccept) { setHTTPHeaderField("Accept", httpAccept); }
123
124         void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String());
125
126         FormData* httpBody() const;
127         void setHTTPBody(PassRefPtr<FormData> httpBody);
128         
129         bool allowCookies() const;
130         void setAllowCookies(bool allowCookies);
131
132         ResourceLoadPriority priority() const;
133         void setPriority(ResourceLoadPriority);
134
135         bool isConditional() const;
136
137         // Whether the associated ResourceHandleClient needs to be notified of
138         // upload progress made for that resource.
139         bool reportUploadProgress() const { return m_reportUploadProgress; }
140         void setReportUploadProgress(bool reportUploadProgress) { m_reportUploadProgress = reportUploadProgress; }
141
142         // Whether the timing information should be collected for the request.
143         bool reportLoadTiming() const { return m_reportLoadTiming; }
144         void setReportLoadTiming(bool reportLoadTiming) { m_reportLoadTiming = reportLoadTiming; }
145
146         // Whether actual headers being sent/received should be collected and reported for the request.
147         bool reportRawHeaders() const { return m_reportRawHeaders; }
148         void setReportRawHeaders(bool reportRawHeaders) { m_reportRawHeaders = reportRawHeaders; }
149
150         // What this request is for.
151         TargetType targetType() const { return m_targetType; }
152         void setTargetType(TargetType type) { m_targetType = type; }
153
154         static bool compare(const ResourceRequest&, const ResourceRequest&);
155
156     protected:
157         // Used when ResourceRequest is initialized from a platform representation of the request
158         ResourceRequestBase()
159             : m_resourceRequestUpdated(false)
160             , m_platformRequestUpdated(true)
161             , m_reportUploadProgress(false)
162             , m_reportLoadTiming(false)
163             , m_reportRawHeaders(false)
164             , m_priority(ResourceLoadPriorityLow)
165             , m_targetType(TargetIsSubresource)
166         {
167         }
168
169         ResourceRequestBase(const KURL& url, ResourceRequestCachePolicy policy)
170             : m_url(url)
171             , m_cachePolicy(policy)
172             , m_timeoutInterval(unspecifiedTimeoutInterval)
173             , m_httpMethod("GET")
174             , m_allowCookies(true)
175             , m_resourceRequestUpdated(true)
176             , m_platformRequestUpdated(false)
177             , m_reportUploadProgress(false)
178             , m_reportLoadTiming(false)
179             , m_reportRawHeaders(false)
180             , m_priority(ResourceLoadPriorityLow)
181             , m_targetType(TargetIsSubresource)
182         {
183         }
184
185         void updatePlatformRequest() const; 
186         void updateResourceRequest() const; 
187
188         // The ResourceRequest subclass may "shadow" this method to compare platform specific fields
189         static bool platformCompare(const ResourceRequest&, const ResourceRequest&) { return true; }
190
191         KURL m_url;
192
193         ResourceRequestCachePolicy m_cachePolicy;
194         double m_timeoutInterval;
195         KURL m_firstPartyForCookies;
196         String m_httpMethod;
197         HTTPHeaderMap m_httpHeaderFields;
198         Vector<String> m_responseContentDispositionEncodingFallbackArray;
199         RefPtr<FormData> m_httpBody;
200         bool m_allowCookies;
201         mutable bool m_resourceRequestUpdated;
202         mutable bool m_platformRequestUpdated;
203         bool m_reportUploadProgress;
204         bool m_reportLoadTiming;
205         bool m_reportRawHeaders;
206         ResourceLoadPriority m_priority;
207         TargetType m_targetType;
208
209     private:
210         const ResourceRequest& asResourceRequest() const;
211     };
212
213     bool equalIgnoringHeaderFields(const ResourceRequestBase&, const ResourceRequestBase&);
214
215     inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequestBase::compare(a, b); }
216     inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); }
217
218     struct CrossThreadResourceRequestDataBase {
219         WTF_MAKE_NONCOPYABLE(CrossThreadResourceRequestDataBase); WTF_MAKE_FAST_ALLOCATED;
220     public:
221         CrossThreadResourceRequestDataBase() { }
222         KURL m_url;
223
224         ResourceRequestCachePolicy m_cachePolicy;
225         double m_timeoutInterval;
226         KURL m_firstPartyForCookies;
227
228         String m_httpMethod;
229         OwnPtr<CrossThreadHTTPHeaderMapData> m_httpHeaders;
230         Vector<String> m_responseContentDispositionEncodingFallbackArray;
231         RefPtr<FormData> m_httpBody;
232         bool m_allowCookies;
233         ResourceLoadPriority m_priority;
234         ResourceRequestBase::TargetType m_targetType;
235     };
236     
237     unsigned initializeMaximumHTTPConnectionCountPerHost();
238
239 #if PLATFORM(CF)
240     bool isHTTPPipeliningEnabled();
241     bool shouldForceHTTPPipeliningPriorityHigh();
242 #else
243     inline bool isHTTPPipeliningEnabled() { return false; }
244     inline bool shouldForceHTTPPipeliningPriorityHigh() { return false; }
245 #endif
246
247 } // namespace WebCore
248
249 #endif // ResourceRequestBase_h