1 /* 2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. 3 * Copyright (C) 2006 Samuel Weinig <sam.weinig (at) 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 "KURL.h" 33 #include "HTTPHeaderMap.h" 34 35 #include <memory> 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 : public FastAllocBase { 54 public: 55 // The type of this ResourceRequest, based on how the resource will be used. 56 enum TargetType { 57 TargetIsMainFrame, 58 TargetIsSubframe, 59 TargetIsSubresource, // Resource is a generic subresource. (Generally a specific type should be specified) 60 TargetIsStyleSheet, 61 TargetIsScript, 62 TargetIsFontResource, 63 TargetIsImage, 64 TargetIsObject, 65 TargetIsMedia 66 }; 67 68 static std::auto_ptr<ResourceRequest> adopt(std::auto_ptr<CrossThreadResourceRequestData>); 69 70 // Gets a copy of the data suitable for passing to another thread. 71 std::auto_ptr<CrossThreadResourceRequestData> copyData() const; 72 73 bool isNull() const; 74 bool isEmpty() const; 75 76 const KURL& url() const; 77 void setURL(const KURL& url); 78 79 void removeCredentials(); 80 81 ResourceRequestCachePolicy cachePolicy() const; 82 void setCachePolicy(ResourceRequestCachePolicy cachePolicy); 83 84 double timeoutInterval() const; 85 void setTimeoutInterval(double timeoutInterval); 86 87 const KURL& firstPartyForCookies() const; 88 void setFirstPartyForCookies(const KURL& firstPartyForCookies); 89 90 const String& httpMethod() const; 91 void setHTTPMethod(const String& httpMethod); 92 93 const HTTPHeaderMap& httpHeaderFields() const; 94 String httpHeaderField(const AtomicString& name) const; 95 String httpHeaderField(const char* name) const; 96 void setHTTPHeaderField(const AtomicString& name, const String& value); 97 void setHTTPHeaderField(const char* name, const String& value); 98 void addHTTPHeaderField(const AtomicString& name, const String& value); 99 void addHTTPHeaderFields(const HTTPHeaderMap& headerFields); 100 101 String httpContentType() const { return httpHeaderField("Content-Type"); } 102 void setHTTPContentType(const String& httpContentType) { setHTTPHeaderField("Content-Type", httpContentType); } 103 104 String httpReferrer() const { return httpHeaderField("Referer"); } 105 void setHTTPReferrer(const String& httpReferrer) { setHTTPHeaderField("Referer", httpReferrer); } 106 void clearHTTPReferrer(); 107 108 String httpOrigin() const { return httpHeaderField("Origin"); } 109 void setHTTPOrigin(const String& httpOrigin) { setHTTPHeaderField("Origin", httpOrigin); } 110 void clearHTTPOrigin(); 111 112 String httpUserAgent() const { return httpHeaderField("User-Agent"); } 113 void setHTTPUserAgent(const String& httpUserAgent) { setHTTPHeaderField("User-Agent", httpUserAgent); } 114 115 String httpAccept() const { return httpHeaderField("Accept"); } 116 void setHTTPAccept(const String& httpAccept) { setHTTPHeaderField("Accept", httpAccept); } 117 118 void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String()); 119 120 FormData* httpBody() const; 121 void setHTTPBody(PassRefPtr<FormData> httpBody); 122 123 bool allowCookies() const; 124 void setAllowCookies(bool allowCookies); 125 126 bool isConditional() const; 127 128 // Whether the associated ResourceHandleClient needs to be notified of 129 // upload progress made for that resource. 130 bool reportUploadProgress() const { return m_reportUploadProgress; } 131 void setReportUploadProgress(bool reportUploadProgress) { m_reportUploadProgress = reportUploadProgress; } 132 133 // What this request is for. 134 TargetType targetType() const { return m_targetType; } 135 void setTargetType(TargetType type) { m_targetType = type; } 136 137 protected: 138 // Used when ResourceRequest is initialized from a platform representation of the request 139 ResourceRequestBase() 140 : m_resourceRequestUpdated(false) 141 , m_platformRequestUpdated(true) 142 , m_reportUploadProgress(false) 143 , m_targetType(TargetIsSubresource) 144 { 145 } 146 147 ResourceRequestBase(const KURL& url, ResourceRequestCachePolicy policy) 148 : m_url(url) 149 , m_cachePolicy(policy) 150 , m_timeoutInterval(unspecifiedTimeoutInterval) 151 , m_httpMethod("GET") 152 , m_allowCookies(true) 153 , m_resourceRequestUpdated(true) 154 , m_platformRequestUpdated(false) 155 , m_reportUploadProgress(false) 156 , m_targetType(TargetIsSubresource) 157 { 158 } 159 160 void updatePlatformRequest() const; 161 void updateResourceRequest() const; 162 163 KURL m_url; 164 165 ResourceRequestCachePolicy m_cachePolicy; 166 double m_timeoutInterval; 167 KURL m_firstPartyForCookies; 168 String m_httpMethod; 169 HTTPHeaderMap m_httpHeaderFields; 170 Vector<String> m_responseContentDispositionEncodingFallbackArray; 171 RefPtr<FormData> m_httpBody; 172 bool m_allowCookies; 173 mutable bool m_resourceRequestUpdated; 174 mutable bool m_platformRequestUpdated; 175 bool m_reportUploadProgress; 176 TargetType m_targetType; 177 178 private: 179 const ResourceRequest& asResourceRequest() const; 180 }; 181 182 bool equalIgnoringHeaderFields(const ResourceRequestBase&, const ResourceRequestBase&); 183 184 bool operator==(const ResourceRequestBase&, const ResourceRequestBase&); 185 inline bool operator!=(ResourceRequestBase& a, const ResourceRequestBase& b) { return !(a == b); } 186 187 struct CrossThreadResourceRequestData : Noncopyable { 188 KURL m_url; 189 190 ResourceRequestCachePolicy m_cachePolicy; 191 double m_timeoutInterval; 192 KURL m_firstPartyForCookies; 193 194 String m_httpMethod; 195 OwnPtr<CrossThreadHTTPHeaderMapData> m_httpHeaders; 196 Vector<String> m_responseContentDispositionEncodingFallbackArray; 197 RefPtr<FormData> m_httpBody; 198 bool m_allowCookies; 199 }; 200 201 unsigned initializeMaximumHTTPConnectionCountPerHost(); 202 203 } // namespace WebCore 204 205 #endif // ResourceRequestBase_h 206