1 /* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "WebURLResponse.h" 33 34 #include "ResourceResponse.h" 35 36 #include "WebHTTPHeaderVisitor.h" 37 #include "WebString.h" 38 #include "WebURL.h" 39 #include "WebURLResponsePrivate.h" 40 41 using namespace WebCore; 42 43 namespace WebKit { 44 45 // The standard implementation of WebURLResponsePrivate, which maintains 46 // ownership of a ResourceResponse instance. 47 class WebURLResponsePrivateImpl : public WebURLResponsePrivate { 48 public: 49 WebURLResponsePrivateImpl() 50 { 51 m_resourceResponse = &m_resourceResponseAllocation; 52 } 53 54 WebURLResponsePrivateImpl(const WebURLResponsePrivate* p) 55 : m_resourceResponseAllocation(*p->m_resourceResponse) 56 { 57 m_resourceResponse = &m_resourceResponseAllocation; 58 } 59 60 virtual void dispose() { delete this; } 61 62 ResourceResponse m_resourceResponseAllocation; 63 }; 64 65 void WebURLResponse::initialize() 66 { 67 assign(new WebURLResponsePrivateImpl()); 68 } 69 70 void WebURLResponse::reset() 71 { 72 assign(0); 73 } 74 75 void WebURLResponse::assign(const WebURLResponse& r) 76 { 77 if (&r != this) 78 assign(r.m_private ? new WebURLResponsePrivateImpl(r.m_private) : 0); 79 } 80 81 bool WebURLResponse::isNull() const 82 { 83 return !m_private || m_private->m_resourceResponse->isNull(); 84 } 85 86 WebURL WebURLResponse::url() const 87 { 88 return m_private->m_resourceResponse->url(); 89 } 90 91 void WebURLResponse::setURL(const WebURL& url) 92 { 93 m_private->m_resourceResponse->setURL(url); 94 } 95 96 WebString WebURLResponse::mimeType() const 97 { 98 return m_private->m_resourceResponse->mimeType(); 99 } 100 101 void WebURLResponse::setMIMEType(const WebString& mimeType) 102 { 103 m_private->m_resourceResponse->setMimeType(mimeType); 104 } 105 106 long long WebURLResponse::expectedContentLength() const 107 { 108 return m_private->m_resourceResponse->expectedContentLength(); 109 } 110 111 void WebURLResponse::setExpectedContentLength(long long expectedContentLength) 112 { 113 m_private->m_resourceResponse->setExpectedContentLength(expectedContentLength); 114 } 115 116 WebString WebURLResponse::textEncodingName() const 117 { 118 return m_private->m_resourceResponse->textEncodingName(); 119 } 120 121 void WebURLResponse::setTextEncodingName(const WebString& textEncodingName) 122 { 123 m_private->m_resourceResponse->setTextEncodingName(textEncodingName); 124 } 125 126 WebString WebURLResponse::suggestedFileName() const 127 { 128 return m_private->m_resourceResponse->suggestedFilename(); 129 } 130 131 void WebURLResponse::setSuggestedFileName(const WebString& suggestedFileName) 132 { 133 m_private->m_resourceResponse->setSuggestedFilename(suggestedFileName); 134 } 135 136 int WebURLResponse::httpStatusCode() const 137 { 138 return m_private->m_resourceResponse->httpStatusCode(); 139 } 140 141 void WebURLResponse::setHTTPStatusCode(int httpStatusCode) 142 { 143 m_private->m_resourceResponse->setHTTPStatusCode(httpStatusCode); 144 } 145 146 WebString WebURLResponse::httpStatusText() const 147 { 148 return m_private->m_resourceResponse->httpStatusText(); 149 } 150 151 void WebURLResponse::setHTTPStatusText(const WebString& httpStatusText) 152 { 153 m_private->m_resourceResponse->setHTTPStatusText(httpStatusText); 154 } 155 156 WebString WebURLResponse::httpHeaderField(const WebString& name) const 157 { 158 return m_private->m_resourceResponse->httpHeaderField(name); 159 } 160 161 void WebURLResponse::setHTTPHeaderField(const WebString& name, const WebString& value) 162 { 163 m_private->m_resourceResponse->setHTTPHeaderField(name, value); 164 } 165 166 void WebURLResponse::addHTTPHeaderField(const WebString& name, const WebString& value) 167 { 168 // FIXME: Add an addHTTPHeaderField method to ResourceResponse. 169 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); 170 String valueStr(value); 171 pair<HTTPHeaderMap::iterator, bool> result = 172 const_cast<HTTPHeaderMap*>(&map)->add(name, valueStr); 173 if (!result.second) 174 result.first->second += ", " + valueStr; 175 } 176 177 void WebURLResponse::clearHTTPHeaderField(const WebString& name) 178 { 179 // FIXME: Add a clearHTTPHeaderField method to ResourceResponse. 180 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); 181 const_cast<HTTPHeaderMap*>(&map)->remove(name); 182 } 183 184 void WebURLResponse::visitHTTPHeaderFields(WebHTTPHeaderVisitor* visitor) const 185 { 186 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); 187 for (HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) 188 visitor->visitHeader(it->first, it->second); 189 } 190 191 double WebURLResponse::lastModifiedDate() const 192 { 193 return static_cast<double>(m_private->m_resourceResponse->lastModifiedDate()); 194 } 195 196 void WebURLResponse::setLastModifiedDate(double lastModifiedDate) 197 { 198 m_private->m_resourceResponse->setLastModifiedDate(static_cast<time_t>(lastModifiedDate)); 199 } 200 201 bool WebURLResponse::isContentFiltered() const 202 { 203 return m_private->m_resourceResponse->isContentFiltered(); 204 } 205 206 void WebURLResponse::setIsContentFiltered(bool isContentFiltered) 207 { 208 m_private->m_resourceResponse->setIsContentFiltered(isContentFiltered); 209 } 210 211 long long WebURLResponse::appCacheID() const 212 { 213 return m_private->m_resourceResponse->appCacheID(); 214 } 215 216 void WebURLResponse::setAppCacheID(long long appCacheID) 217 { 218 m_private->m_resourceResponse->setAppCacheID(appCacheID); 219 } 220 221 WebURL WebURLResponse::appCacheManifestURL() const 222 { 223 return m_private->m_resourceResponse->appCacheManifestURL(); 224 } 225 226 void WebURLResponse::setAppCacheManifestURL(const WebURL& url) 227 { 228 m_private->m_resourceResponse->setAppCacheManifestURL(url); 229 } 230 231 WebCString WebURLResponse::securityInfo() const 232 { 233 // FIXME: getSecurityInfo is misnamed. 234 return m_private->m_resourceResponse->getSecurityInfo(); 235 } 236 237 void WebURLResponse::setSecurityInfo(const WebCString& securityInfo) 238 { 239 m_private->m_resourceResponse->setSecurityInfo(securityInfo); 240 } 241 242 ResourceResponse& WebURLResponse::toMutableResourceResponse() 243 { 244 ASSERT(m_private); 245 ASSERT(m_private->m_resourceResponse); 246 247 return *m_private->m_resourceResponse; 248 } 249 250 const ResourceResponse& WebURLResponse::toResourceResponse() const 251 { 252 ASSERT(m_private); 253 ASSERT(m_private->m_resourceResponse); 254 255 return *m_private->m_resourceResponse; 256 } 257 258 bool WebURLResponse::wasFetchedViaSPDY() const 259 { 260 return m_private->m_resourceResponse->wasFetchedViaSPDY(); 261 } 262 263 void WebURLResponse::setWasFetchedViaSPDY(bool value) 264 { 265 m_private->m_resourceResponse->setWasFetchedViaSPDY(value); 266 } 267 268 void WebURLResponse::assign(WebURLResponsePrivate* p) 269 { 270 // Subclasses may call this directly so a self-assignment check is needed 271 // here as well as in the public assign method. 272 if (m_private == p) 273 return; 274 if (m_private) 275 m_private->dispose(); 276 m_private = p; 277 } 278 279 } // namespace WebKit 280