1 /* 2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Google Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 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. 13 * 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. 25 */ 26 27 #ifndef ResourceResponseBase_h 28 #define ResourceResponseBase_h 29 30 #include "HTTPHeaderMap.h" 31 #include "KURL.h" 32 #include "ResourceLoadInfo.h" 33 #include "ResourceLoadTiming.h" 34 35 #include <wtf/PassOwnPtr.h> 36 #include <wtf/RefPtr.h> 37 38 #if OS(SOLARIS) 39 #include <sys/time.h> // For time_t structure. 40 #endif 41 42 namespace WebCore { 43 44 class ResourceResponse; 45 struct CrossThreadResourceResponseData; 46 47 // Do not use this class directly, use the class ResponseResponse instead 48 class ResourceResponseBase { 49 WTF_MAKE_FAST_ALLOCATED; 50 public: 51 static PassOwnPtr<ResourceResponse> adopt(PassOwnPtr<CrossThreadResourceResponseData>); 52 53 // Gets a copy of the data suitable for passing to another thread. 54 PassOwnPtr<CrossThreadResourceResponseData> copyData() const; 55 56 bool isNull() const { return m_isNull; } 57 bool isHTTP() const; 58 59 const KURL& url() const; 60 void setURL(const KURL& url); 61 62 const String& mimeType() const; 63 void setMimeType(const String& mimeType); 64 65 long long expectedContentLength() const; 66 void setExpectedContentLength(long long expectedContentLength); 67 68 const String& textEncodingName() const; 69 void setTextEncodingName(const String& name); 70 71 // FIXME should compute this on the fly 72 const String& suggestedFilename() const; 73 void setSuggestedFilename(const String&); 74 75 int httpStatusCode() const; 76 void setHTTPStatusCode(int); 77 78 const String& httpStatusText() const; 79 void setHTTPStatusText(const String&); 80 81 String httpHeaderField(const AtomicString& name) const; 82 String httpHeaderField(const char* name) const; 83 void setHTTPHeaderField(const AtomicString& name, const String& value); 84 const HTTPHeaderMap& httpHeaderFields() const; 85 86 bool isMultipart() const { return mimeType() == "multipart/x-mixed-replace"; } 87 88 bool isAttachment() const; 89 90 // FIXME: These are used by PluginStream on some platforms. Calculations may differ from just returning plain Last-odified header. 91 // Leaving it for now but this should go away in favor of generic solution. 92 void setLastModifiedDate(time_t); 93 time_t lastModifiedDate() const; 94 95 // These functions return parsed values of the corresponding response headers. 96 // NaN means that the header was not present or had invalid value. 97 bool cacheControlContainsNoCache() const; 98 bool cacheControlContainsNoStore() const; 99 bool cacheControlContainsMustRevalidate() const; 100 bool hasCacheValidatorFields() const; 101 double cacheControlMaxAge() const; 102 double date() const; 103 double age() const; 104 double expires() const; 105 double lastModified() const; 106 107 unsigned connectionID() const; 108 void setConnectionID(unsigned); 109 110 bool connectionReused() const; 111 void setConnectionReused(bool); 112 113 bool wasCached() const; 114 void setWasCached(bool); 115 116 ResourceLoadTiming* resourceLoadTiming() const; 117 void setResourceLoadTiming(PassRefPtr<ResourceLoadTiming>); 118 119 PassRefPtr<ResourceLoadInfo> resourceLoadInfo() const; 120 void setResourceLoadInfo(PassRefPtr<ResourceLoadInfo>); 121 122 // The ResourceResponse subclass may "shadow" this method to provide platform-specific memory usage information 123 unsigned memoryUsage() const 124 { 125 // average size, mostly due to URL and Header Map strings 126 return 1280; 127 } 128 129 static bool compare(const ResourceResponse&, const ResourceResponse&); 130 131 protected: 132 enum InitLevel { 133 Uninitialized, 134 CommonFieldsOnly, 135 AllFields 136 }; 137 138 ResourceResponseBase(); 139 ResourceResponseBase(const KURL& url, const String& mimeType, long long expectedLength, const String& textEncodingName, const String& filename); 140 141 void lazyInit(InitLevel) const; 142 143 // The ResourceResponse subclass may "shadow" this method to lazily initialize platform specific fields 144 void platformLazyInit(InitLevel) { } 145 146 // The ResourceResponse subclass may "shadow" this method to compare platform specific fields 147 static bool platformCompare(const ResourceResponse&, const ResourceResponse&) { return true; } 148 149 KURL m_url; 150 String m_mimeType; 151 long long m_expectedContentLength; 152 String m_textEncodingName; 153 String m_suggestedFilename; 154 int m_httpStatusCode; 155 String m_httpStatusText; 156 HTTPHeaderMap m_httpHeaderFields; 157 time_t m_lastModifiedDate; 158 bool m_wasCached : 1; 159 unsigned m_connectionID; 160 bool m_connectionReused : 1; 161 RefPtr<ResourceLoadTiming> m_resourceLoadTiming; 162 RefPtr<ResourceLoadInfo> m_resourceLoadInfo; 163 164 bool m_isNull : 1; 165 166 private: 167 const ResourceResponse& asResourceResponse() const; 168 void parseCacheControlDirectives() const; 169 170 mutable bool m_haveParsedCacheControlHeader : 1; 171 mutable bool m_haveParsedAgeHeader : 1; 172 mutable bool m_haveParsedDateHeader : 1; 173 mutable bool m_haveParsedExpiresHeader : 1; 174 mutable bool m_haveParsedLastModifiedHeader : 1; 175 176 mutable bool m_cacheControlContainsNoCache : 1; 177 mutable bool m_cacheControlContainsNoStore : 1; 178 mutable bool m_cacheControlContainsMustRevalidate : 1; 179 mutable double m_cacheControlMaxAge; 180 181 mutable double m_age; 182 mutable double m_date; 183 mutable double m_expires; 184 mutable double m_lastModified; 185 }; 186 187 inline bool operator==(const ResourceResponse& a, const ResourceResponse& b) { return ResourceResponseBase::compare(a, b); } 188 inline bool operator!=(const ResourceResponse& a, const ResourceResponse& b) { return !(a == b); } 189 190 struct CrossThreadResourceResponseDataBase { 191 WTF_MAKE_NONCOPYABLE(CrossThreadResourceResponseDataBase); 192 public: 193 CrossThreadResourceResponseDataBase() { } 194 KURL m_url; 195 String m_mimeType; 196 long long m_expectedContentLength; 197 String m_textEncodingName; 198 String m_suggestedFilename; 199 int m_httpStatusCode; 200 String m_httpStatusText; 201 OwnPtr<CrossThreadHTTPHeaderMapData> m_httpHeaders; 202 time_t m_lastModifiedDate; 203 RefPtr<ResourceLoadTiming> m_resourceLoadTiming; 204 }; 205 206 } // namespace WebCore 207 208 #endif // ResourceResponseBase_h 209