837d3fbb4b712cd441637b855a605e1572285019
[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 namespace WebCore {
36
37     enum ResourceRequestCachePolicy {
38         UseProtocolCachePolicy, // normal load
39         ReloadIgnoringCacheData, // reload
40         ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data
41         ReturnCacheDataDontLoad, // results of a post - allow stale data and only use cache
42     };
43
44     struct ResourceRequest {
45
46         ResourceRequest(const String& url) 
47             : m_url(url.deprecatedString())
48             , m_cachePolicy(UseProtocolCachePolicy)
49             , m_timeoutInterval(defaultTimeoutInterval)
50             , m_httpMethod("GET")
51             , m_allowHTTPCookies(true)
52         {
53         }
54
55         ResourceRequest(const KURL& url) 
56             : m_url(url)
57             , m_cachePolicy(UseProtocolCachePolicy)
58             , m_timeoutInterval(defaultTimeoutInterval)
59             , m_httpMethod("GET")
60             , m_allowHTTPCookies(true)
61         {
62         }
63
64         ResourceRequest(const KURL& url, const String& referrer, ResourceRequestCachePolicy policy = UseProtocolCachePolicy) 
65             : m_url(url)
66             , m_cachePolicy(policy)
67             , m_timeoutInterval(defaultTimeoutInterval)
68             , m_httpMethod("GET")
69             , m_allowHTTPCookies(true)
70         {
71             setHTTPReferrer(referrer);
72         }
73         
74         ResourceRequest()
75             : m_cachePolicy(UseProtocolCachePolicy)
76             , m_timeoutInterval(defaultTimeoutInterval)
77             , m_allowHTTPCookies(true)
78         {
79         }
80
81         bool isEmpty() const { return m_url.isEmpty(); }
82
83         const KURL& url() const { return m_url; }
84         void setURL(const KURL& url) { m_url = url; }
85
86         const ResourceRequestCachePolicy cachePolicy() const { return m_cachePolicy; }
87         void setCachePolicy(ResourceRequestCachePolicy cachePolicy) { m_cachePolicy = cachePolicy; }
88         
89         double timeoutInterval() const { return m_timeoutInterval; }
90         void setTimeoutInterval(double timeoutInterval) { m_timeoutInterval = timeoutInterval; }
91         
92         const KURL& mainDocumentURL() const { return m_mainDocumentURL; }
93         void setMainDocumentURL(const KURL& mainDocumentURL) { m_mainDocumentURL = mainDocumentURL; }
94         
95         const String& httpMethod() const { return m_httpMethod; }
96         void setHTTPMethod(const String& httpMethod) { m_httpMethod = httpMethod; }
97         
98         const HTTPHeaderMap& httpHeaderFields() const { return m_httpHeaderFields; }
99         String httpHeaderField(const String& name) const { return m_httpHeaderFields.get(name); }
100         void setHTTPHeaderField(const String& name, const String& value) { m_httpHeaderFields.set(name, value); }
101         void addHTTPHeaderField(const String& name, const String& value);
102         void addHTTPHeaderFields(const HTTPHeaderMap& headerFields);
103         
104         String httpContentType() const { return httpHeaderField("Content-Type");  }
105         void setHTTPContentType(const String& httpContentType) { setHTTPHeaderField("Content-Type", httpContentType); }
106         
107         String httpReferrer() const { return httpHeaderField("Referer"); }
108         void setHTTPReferrer(const String& httpReferrer) { setHTTPHeaderField("Referer", httpReferrer); }
109         
110         String httpUserAgent() const { return httpHeaderField("User-Agent"); }
111         void setHTTPUserAgent(const String& httpUserAgent) { setHTTPHeaderField("User-Agent", httpUserAgent); }
112
113         String httpAccept() const { return httpHeaderField("Accept"); }
114         void setHTTPAccept(const String& httpUserAgent) { setHTTPHeaderField("Accept", httpUserAgent); }
115
116         const FormData& httpBody() const { return m_httpBody; }
117         FormData& httpBody() { return m_httpBody; }
118         void setHTTPBody(const FormData& httpBody) { m_httpBody = httpBody; } 
119         
120         bool allowHTTPCookies() const { return m_allowHTTPCookies; }
121         void setAllowHTTPCookies(bool allowHTTPCookies) { m_allowHTTPCookies = allowHTTPCookies; }
122
123     private:
124         static const int defaultTimeoutInterval = 60;
125
126         KURL m_url;
127
128         ResourceRequestCachePolicy m_cachePolicy;
129         double m_timeoutInterval;
130         KURL m_mainDocumentURL;
131         String m_httpMethod;
132         HTTPHeaderMap m_httpHeaderFields;
133         FormData m_httpBody;
134         bool m_allowHTTPCookies;
135     };
136
137     inline void ResourceRequest::addHTTPHeaderField(const String& name, const String& value) 
138     {
139         pair<HTTPHeaderMap::iterator, bool> result = m_httpHeaderFields.add(name, value); 
140         if (!result.second)
141             result.first->second += "," + value;
142     }
143
144     // FIXME: probably shouldn't inline this
145     inline void ResourceRequest::addHTTPHeaderFields(const HTTPHeaderMap& headerFields)
146     {
147         HTTPHeaderMap::const_iterator end = headerFields.end();
148         for (HTTPHeaderMap::const_iterator it = headerFields.begin(); it != end; ++it)
149             addHTTPHeaderField(it->first, it->second);
150     }
151
152 } // namespace WebCore
153
154 #endif // ResourceRequest_H_