75301d73683167e379c148e093a030efe1a53aee
[WebKit-https.git] / WebCore / platform / network / ResourceRequest.h
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  * Copyright (C) 2003, 2006 Apple Computer, Inc.  All rights reserved.
4  * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
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 ResourceRequest_h
29 #define ResourceRequest_h
30
31 #include "FormData.h"
32 #include "KURL.h"
33 #include "HTTPHeaderMap.h"
34
35 #if PLATFORM(MAC)
36 #include "RetainPtr.h"
37 #ifdef __OBJC__
38 @class NSURLRequest;
39 #else
40 class NSURLRequest;
41 #endif
42 #elif USE(CFNETWORK)
43 #include "RetainPtr.h"
44 typedef const struct _CFURLRequest* CFURLRequestRef;
45 #endif
46
47 namespace WebCore {
48
49     enum ResourceRequestCachePolicy {
50         UseProtocolCachePolicy, // normal load
51         ReloadIgnoringCacheData, // reload
52         ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data
53         ReturnCacheDataDontLoad, // results of a post - allow stale data and only use cache
54     };
55
56     struct ResourceRequest {
57
58         
59         ResourceRequest(const String& url) 
60             : m_url(url.deprecatedString())
61             , m_cachePolicy(UseProtocolCachePolicy)
62             , m_timeoutInterval(defaultTimeoutInterval)
63             , m_httpMethod("GET")
64             , m_allowHTTPCookies(true)
65             , m_resourceRequestUpdated(true)
66             , m_platformRequestUpdated(false)
67         {
68         }
69
70         ResourceRequest(const KURL& url) 
71             : m_url(url)
72             , m_cachePolicy(UseProtocolCachePolicy)
73             , m_timeoutInterval(defaultTimeoutInterval)
74             , m_httpMethod("GET")
75             , m_allowHTTPCookies(true)
76             , m_resourceRequestUpdated(true)
77             , m_platformRequestUpdated(false)
78         {
79         }
80
81         ResourceRequest(const KURL& url, const String& referrer, ResourceRequestCachePolicy policy = UseProtocolCachePolicy) 
82             : m_url(url)
83             , m_cachePolicy(policy)
84             , m_timeoutInterval(defaultTimeoutInterval)
85             , m_httpMethod("GET")
86             , m_allowHTTPCookies(true)
87             , m_resourceRequestUpdated(true)
88             , m_platformRequestUpdated(false)
89         {
90             setHTTPReferrer(referrer);
91         }
92         
93         ResourceRequest()
94             : m_cachePolicy(UseProtocolCachePolicy)
95             , m_timeoutInterval(defaultTimeoutInterval)
96             , m_httpMethod("GET")
97             , m_allowHTTPCookies(true)
98             , m_resourceRequestUpdated(true)
99             , m_platformRequestUpdated(false)
100         {
101         }
102
103         bool isNull() const;
104         bool isEmpty() const;
105
106         const KURL& url() const;
107         void setURL(const KURL& url);
108
109         const ResourceRequestCachePolicy cachePolicy() const;
110         void setCachePolicy(ResourceRequestCachePolicy cachePolicy);
111         
112         double timeoutInterval() const;
113         void setTimeoutInterval(double timeoutInterval);
114         
115         const KURL& mainDocumentURL() const;
116         void setMainDocumentURL(const KURL& mainDocumentURL);
117         
118         const String& httpMethod() const;
119         void setHTTPMethod(const String& httpMethod);
120         
121         const HTTPHeaderMap& httpHeaderFields() const;
122         String httpHeaderField(const String& name) const;
123         void setHTTPHeaderField(const String& name, const String& value);
124         void addHTTPHeaderField(const String& name, const String& value);
125         void addHTTPHeaderFields(const HTTPHeaderMap& headerFields);
126         
127         String httpContentType() const { return httpHeaderField("Content-Type");  }
128         void setHTTPContentType(const String& httpContentType) { setHTTPHeaderField("Content-Type", httpContentType); }
129         
130         String httpReferrer() const { return httpHeaderField("Referer"); }
131         void setHTTPReferrer(const String& httpReferrer) { setHTTPHeaderField("Referer", httpReferrer); }
132         
133         String httpUserAgent() const { return httpHeaderField("User-Agent"); }
134         void setHTTPUserAgent(const String& httpUserAgent) { setHTTPHeaderField("User-Agent", httpUserAgent); }
135
136         String httpAccept() const { return httpHeaderField("Accept"); }
137         void setHTTPAccept(const String& httpAccept) { setHTTPHeaderField("Accept", httpAccept); }
138
139         FormData* httpBody() const;
140         void setHTTPBody(PassRefPtr<FormData> httpBody);
141         
142         bool allowHTTPCookies() const;
143         void setAllowHTTPCookies(bool allowHTTPCookies);
144
145         bool isConditional() const;
146         
147 #if PLATFORM(MAC)
148         ResourceRequest(NSURLRequest* nsRequest)
149             : m_resourceRequestUpdated(false)
150             , m_platformRequestUpdated(true)
151             , m_nsRequest(nsRequest) { }
152         
153         NSURLRequest* nsURLRequest() const;
154 #elif USE(CFNETWORK)
155         ResourceRequest(CFURLRequestRef cfRequest)
156             : m_resourceRequestUpdated(false)
157             , m_platformRequestUpdated(true)
158             , m_cfRequest(cfRequest) { }
159         
160         CFURLRequestRef cfURLRequest() const;       
161 #endif
162     private:
163         void updatePlatformRequest() const; 
164         void updateResourceRequest() const; 
165
166 #if PLATFORM(MAC) || USE(CFNETWORK)
167         void doUpdatePlatformRequest();
168         void doUpdateResourceRequest();
169 #endif
170         
171         static const int defaultTimeoutInterval = 60;
172
173         KURL m_url;
174
175         ResourceRequestCachePolicy m_cachePolicy;
176         double m_timeoutInterval;
177         KURL m_mainDocumentURL;
178         String m_httpMethod;
179         HTTPHeaderMap m_httpHeaderFields;
180         RefPtr<FormData> m_httpBody;
181         bool m_allowHTTPCookies;
182         mutable bool m_resourceRequestUpdated;
183         mutable bool m_platformRequestUpdated;
184 #if PLATFORM(MAC)
185         RetainPtr<NSURLRequest> m_nsRequest;
186 #elif USE(CFNETWORK)
187         RetainPtr<CFURLRequestRef> m_cfRequest;      
188 #endif
189     };
190
191     bool operator==(const ResourceRequest& a, const ResourceRequest& b);
192     inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); }
193
194 } // namespace WebCore
195
196 #endif // ResourceRequest_h