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 "public/platform/WebURLResponse.h" 33 34 #include "platform/exported/WebURLResponsePrivate.h" 35 #include "platform/network/ResourceLoadTiming.h" 36 #include "platform/network/ResourceResponse.h" 37 #include "public/platform/WebHTTPHeaderVisitor.h" 38 #include "public/platform/WebHTTPLoadInfo.h" 39 #include "public/platform/WebString.h" 40 #include "public/platform/WebURL.h" 41 #include "public/platform/WebURLLoadTiming.h" 42 #include "wtf/RefPtr.h" 43 44 namespace blink { 45 46 namespace { 47 48 class ExtraDataContainer : public ResourceResponse::ExtraData { 49 public: 50 static PassRefPtr<ExtraDataContainer> create(WebURLResponse::ExtraData* extraData) { return adoptRef(new ExtraDataContainer(extraData)); } 51 52 virtual ~ExtraDataContainer() { } 53 54 WebURLResponse::ExtraData* extraData() const { return m_extraData.get(); } 55 56 private: 57 explicit ExtraDataContainer(WebURLResponse::ExtraData* extraData) 58 : m_extraData(adoptPtr(extraData)) 59 { 60 } 61 62 OwnPtr<WebURLResponse::ExtraData> m_extraData; 63 }; 64 65 } // namespace 66 67 // The standard implementation of WebURLResponsePrivate, which maintains 68 // ownership of a ResourceResponse instance. 69 class WebURLResponsePrivateImpl : public WebURLResponsePrivate { 70 public: 71 WebURLResponsePrivateImpl() 72 { 73 m_resourceResponse = &m_resourceResponseAllocation; 74 } 75 76 WebURLResponsePrivateImpl(const WebURLResponsePrivate* p) 77 : m_resourceResponseAllocation(*p->m_resourceResponse) 78 { 79 m_resourceResponse = &m_resourceResponseAllocation; 80 } 81 82 virtual void dispose() { delete this; } 83 84 private: 85 virtual ~WebURLResponsePrivateImpl() { } 86 87 ResourceResponse m_resourceResponseAllocation; 88 }; 89 90 void WebURLResponse::initialize() 91 { 92 assign(new WebURLResponsePrivateImpl()); 93 } 94 95 void WebURLResponse::reset() 96 { 97 assign(0); 98 } 99 100 void WebURLResponse::assign(const WebURLResponse& r) 101 { 102 if (&r != this) 103 assign(r.m_private ? new WebURLResponsePrivateImpl(r.m_private) : 0); 104 } 105 106 bool WebURLResponse::isNull() const 107 { 108 return !m_private || m_private->m_resourceResponse->isNull(); 109 } 110 111 WebURL WebURLResponse::url() const 112 { 113 return m_private->m_resourceResponse->url(); 114 } 115 116 void WebURLResponse::setURL(const WebURL& url) 117 { 118 m_private->m_resourceResponse->setURL(url); 119 } 120 121 unsigned WebURLResponse::connectionID() const 122 { 123 return m_private->m_resourceResponse->connectionID(); 124 } 125 126 void WebURLResponse::setConnectionID(unsigned connectionID) 127 { 128 m_private->m_resourceResponse->setConnectionID(connectionID); 129 } 130 131 bool WebURLResponse::connectionReused() const 132 { 133 return m_private->m_resourceResponse->connectionReused(); 134 } 135 136 void WebURLResponse::setConnectionReused(bool connectionReused) 137 { 138 m_private->m_resourceResponse->setConnectionReused(connectionReused); 139 } 140 141 WebURLLoadTiming WebURLResponse::loadTiming() 142 { 143 return WebURLLoadTiming(m_private->m_resourceResponse->resourceLoadTiming()); 144 } 145 146 void WebURLResponse::setLoadTiming(const WebURLLoadTiming& timing) 147 { 148 RefPtr<ResourceLoadTiming> loadTiming = PassRefPtr<ResourceLoadTiming>(timing); 149 m_private->m_resourceResponse->setResourceLoadTiming(loadTiming.release()); 150 } 151 152 WebHTTPLoadInfo WebURLResponse::httpLoadInfo() 153 { 154 return WebHTTPLoadInfo(m_private->m_resourceResponse->resourceLoadInfo()); 155 } 156 157 void WebURLResponse::setHTTPLoadInfo(const WebHTTPLoadInfo& value) 158 { 159 m_private->m_resourceResponse->setResourceLoadInfo(value); 160 } 161 162 double WebURLResponse::responseTime() const 163 { 164 return m_private->m_resourceResponse->responseTime(); 165 } 166 167 void WebURLResponse::setResponseTime(double responseTime) 168 { 169 m_private->m_resourceResponse->setResponseTime(responseTime); 170 } 171 172 WebString WebURLResponse::mimeType() const 173 { 174 return m_private->m_resourceResponse->mimeType(); 175 } 176 177 void WebURLResponse::setMIMEType(const WebString& mimeType) 178 { 179 m_private->m_resourceResponse->setMimeType(mimeType); 180 } 181 182 long long WebURLResponse::expectedContentLength() const 183 { 184 return m_private->m_resourceResponse->expectedContentLength(); 185 } 186 187 void WebURLResponse::setExpectedContentLength(long long expectedContentLength) 188 { 189 m_private->m_resourceResponse->setExpectedContentLength(expectedContentLength); 190 } 191 192 WebString WebURLResponse::textEncodingName() const 193 { 194 return m_private->m_resourceResponse->textEncodingName(); 195 } 196 197 void WebURLResponse::setTextEncodingName(const WebString& textEncodingName) 198 { 199 m_private->m_resourceResponse->setTextEncodingName(textEncodingName); 200 } 201 202 WebString WebURLResponse::suggestedFileName() const 203 { 204 return m_private->m_resourceResponse->suggestedFilename(); 205 } 206 207 void WebURLResponse::setSuggestedFileName(const WebString& suggestedFileName) 208 { 209 m_private->m_resourceResponse->setSuggestedFilename(suggestedFileName); 210 } 211 212 WebURLResponse::HTTPVersion WebURLResponse::httpVersion() const 213 { 214 return static_cast<HTTPVersion>(m_private->m_resourceResponse->httpVersion()); 215 } 216 217 void WebURLResponse::setHTTPVersion(HTTPVersion version) 218 { 219 m_private->m_resourceResponse->setHTTPVersion(static_cast<ResourceResponse::HTTPVersion>(version)); 220 } 221 222 int WebURLResponse::httpStatusCode() const 223 { 224 return m_private->m_resourceResponse->httpStatusCode(); 225 } 226 227 void WebURLResponse::setHTTPStatusCode(int httpStatusCode) 228 { 229 m_private->m_resourceResponse->setHTTPStatusCode(httpStatusCode); 230 } 231 232 WebString WebURLResponse::httpStatusText() const 233 { 234 return m_private->m_resourceResponse->httpStatusText(); 235 } 236 237 void WebURLResponse::setHTTPStatusText(const WebString& httpStatusText) 238 { 239 m_private->m_resourceResponse->setHTTPStatusText(httpStatusText); 240 } 241 242 WebString WebURLResponse::httpHeaderField(const WebString& name) const 243 { 244 return m_private->m_resourceResponse->httpHeaderField(name); 245 } 246 247 void WebURLResponse::setHTTPHeaderField(const WebString& name, const WebString& value) 248 { 249 m_private->m_resourceResponse->setHTTPHeaderField(name, value); 250 } 251 252 void WebURLResponse::addHTTPHeaderField(const WebString& name, const WebString& value) 253 { 254 if (name.isNull() || value.isNull()) 255 return; 256 257 m_private->m_resourceResponse->addHTTPHeaderField(name, value); 258 } 259 260 void WebURLResponse::clearHTTPHeaderField(const WebString& name) 261 { 262 m_private->m_resourceResponse->clearHTTPHeaderField(name); 263 } 264 265 void WebURLResponse::visitHTTPHeaderFields(WebHTTPHeaderVisitor* visitor) const 266 { 267 const HTTPHeaderMap& map = m_private->m_resourceResponse->httpHeaderFields(); 268 for (HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) 269 visitor->visitHeader(it->key, it->value); 270 } 271 272 double WebURLResponse::lastModifiedDate() const 273 { 274 return static_cast<double>(m_private->m_resourceResponse->lastModifiedDate()); 275 } 276 277 void WebURLResponse::setLastModifiedDate(double lastModifiedDate) 278 { 279 m_private->m_resourceResponse->setLastModifiedDate(static_cast<time_t>(lastModifiedDate)); 280 } 281 282 long long WebURLResponse::appCacheID() const 283 { 284 return m_private->m_resourceResponse->appCacheID(); 285 } 286 287 void WebURLResponse::setAppCacheID(long long appCacheID) 288 { 289 m_private->m_resourceResponse->setAppCacheID(appCacheID); 290 } 291 292 WebURL WebURLResponse::appCacheManifestURL() const 293 { 294 return m_private->m_resourceResponse->appCacheManifestURL(); 295 } 296 297 void WebURLResponse::setAppCacheManifestURL(const WebURL& url) 298 { 299 m_private->m_resourceResponse->setAppCacheManifestURL(url); 300 } 301 302 WebCString WebURLResponse::securityInfo() const 303 { 304 // FIXME: getSecurityInfo is misnamed. 305 return m_private->m_resourceResponse->getSecurityInfo(); 306 } 307 308 void WebURLResponse::setSecurityInfo(const WebCString& securityInfo) 309 { 310 m_private->m_resourceResponse->setSecurityInfo(securityInfo); 311 } 312 313 ResourceResponse& WebURLResponse::toMutableResourceResponse() 314 { 315 ASSERT(m_private); 316 ASSERT(m_private->m_resourceResponse); 317 318 return *m_private->m_resourceResponse; 319 } 320 321 const ResourceResponse& WebURLResponse::toResourceResponse() const 322 { 323 ASSERT(m_private); 324 ASSERT(m_private->m_resourceResponse); 325 326 return *m_private->m_resourceResponse; 327 } 328 329 bool WebURLResponse::wasCached() const 330 { 331 return m_private->m_resourceResponse->wasCached(); 332 } 333 334 void WebURLResponse::setWasCached(bool value) 335 { 336 m_private->m_resourceResponse->setWasCached(value); 337 } 338 339 bool WebURLResponse::wasFetchedViaSPDY() const 340 { 341 return m_private->m_resourceResponse->wasFetchedViaSPDY(); 342 } 343 344 void WebURLResponse::setWasFetchedViaSPDY(bool value) 345 { 346 m_private->m_resourceResponse->setWasFetchedViaSPDY(value); 347 } 348 349 bool WebURLResponse::wasNpnNegotiated() const 350 { 351 return m_private->m_resourceResponse->wasNpnNegotiated(); 352 } 353 354 void WebURLResponse::setWasNpnNegotiated(bool value) 355 { 356 m_private->m_resourceResponse->setWasNpnNegotiated(value); 357 } 358 359 bool WebURLResponse::wasAlternateProtocolAvailable() const 360 { 361 return m_private->m_resourceResponse->wasAlternateProtocolAvailable(); 362 } 363 364 void WebURLResponse::setWasAlternateProtocolAvailable(bool value) 365 { 366 m_private->m_resourceResponse->setWasAlternateProtocolAvailable(value); 367 } 368 369 bool WebURLResponse::wasFetchedViaProxy() const 370 { 371 return m_private->m_resourceResponse->wasFetchedViaProxy(); 372 } 373 374 void WebURLResponse::setWasFetchedViaProxy(bool value) 375 { 376 m_private->m_resourceResponse->setWasFetchedViaProxy(value); 377 } 378 379 bool WebURLResponse::wasFetchedViaServiceWorker() const 380 { 381 return m_private->m_resourceResponse->wasFetchedViaServiceWorker(); 382 } 383 384 void WebURLResponse::setWasFetchedViaServiceWorker(bool value) 385 { 386 m_private->m_resourceResponse->setWasFetchedViaServiceWorker(value); 387 } 388 389 bool WebURLResponse::isMultipartPayload() const 390 { 391 return m_private->m_resourceResponse->isMultipartPayload(); 392 } 393 394 void WebURLResponse::setIsMultipartPayload(bool value) 395 { 396 m_private->m_resourceResponse->setIsMultipartPayload(value); 397 } 398 399 WebString WebURLResponse::downloadFilePath() const 400 { 401 return m_private->m_resourceResponse->downloadedFilePath(); 402 } 403 404 void WebURLResponse::setDownloadFilePath(const WebString& downloadFilePath) 405 { 406 m_private->m_resourceResponse->setDownloadedFilePath(downloadFilePath); 407 } 408 409 WebString WebURLResponse::remoteIPAddress() const 410 { 411 return m_private->m_resourceResponse->remoteIPAddress(); 412 } 413 414 void WebURLResponse::setRemoteIPAddress(const WebString& remoteIPAddress) 415 { 416 m_private->m_resourceResponse->setRemoteIPAddress(remoteIPAddress); 417 } 418 419 unsigned short WebURLResponse::remotePort() const 420 { 421 return m_private->m_resourceResponse->remotePort(); 422 } 423 424 void WebURLResponse::setRemotePort(unsigned short remotePort) 425 { 426 m_private->m_resourceResponse->setRemotePort(remotePort); 427 } 428 429 WebURLResponse::ExtraData* WebURLResponse::extraData() const 430 { 431 RefPtr<ResourceResponse::ExtraData> data = m_private->m_resourceResponse->extraData(); 432 if (!data) 433 return 0; 434 return static_cast<ExtraDataContainer*>(data.get())->extraData(); 435 } 436 437 void WebURLResponse::setExtraData(WebURLResponse::ExtraData* extraData) 438 { 439 m_private->m_resourceResponse->setExtraData(ExtraDataContainer::create(extraData)); 440 } 441 442 void WebURLResponse::assign(WebURLResponsePrivate* p) 443 { 444 // Subclasses may call this directly so a self-assignment check is needed 445 // here as well as in the public assign method. 446 if (m_private == p) 447 return; 448 if (m_private) 449 m_private->dispose(); 450 m_private = p; 451 } 452 453 } // namespace blink 454