2 * Copyright (C) 2009 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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
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.
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.
32 #include "public/platform/WebURLResponse.h"
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"
48 class ExtraDataContainer : public ResourceResponse::ExtraData {
50 static PassRefPtr<ExtraDataContainer> create(WebURLResponse::ExtraData* extraData) { return adoptRef(new ExtraDataContainer(extraData)); }
52 virtual ~ExtraDataContainer() { }
54 WebURLResponse::ExtraData* extraData() const { return m_extraData.get(); }
57 explicit ExtraDataContainer(WebURLResponse::ExtraData* extraData)
58 : m_extraData(adoptPtr(extraData))
62 OwnPtr<WebURLResponse::ExtraData> m_extraData;
67 // The standard implementation of WebURLResponsePrivate, which maintains
68 // ownership of a ResourceResponse instance.
69 class WebURLResponsePrivateImpl : public WebURLResponsePrivate {
71 WebURLResponsePrivateImpl()
73 m_resourceResponse = &m_resourceResponseAllocation;
76 WebURLResponsePrivateImpl(const WebURLResponsePrivate* p)
77 : m_resourceResponseAllocation(*p->m_resourceResponse)
79 m_resourceResponse = &m_resourceResponseAllocation;
82 virtual void dispose() { delete this; }
85 virtual ~WebURLResponsePrivateImpl() { }
87 ResourceResponse m_resourceResponseAllocation;
90 void WebURLResponse::initialize()
92 assign(new WebURLResponsePrivateImpl());
95 void WebURLResponse::reset()
100 void WebURLResponse::assign(const WebURLResponse& r)
103 assign(r.m_private ? new WebURLResponsePrivateImpl(r.m_private) : 0);
106 bool WebURLResponse::isNull() const
108 return !m_private || m_private->m_resourceResponse->isNull();
111 WebURL WebURLResponse::url() const
113 return m_private->m_resourceResponse->url();
116 void WebURLResponse::setURL(const WebURL& url)
118 m_private->m_resourceResponse->setURL(url);
121 unsigned WebURLResponse::connectionID() const
123 return m_private->m_resourceResponse->connectionID();
126 void WebURLResponse::setConnectionID(unsigned connectionID)
128 m_private->m_resourceResponse->setConnectionID(connectionID);
131 bool WebURLResponse::connectionReused() const
133 return m_private->m_resourceResponse->connectionReused();
136 void WebURLResponse::setConnectionReused(bool connectionReused)
138 m_private->m_resourceResponse->setConnectionReused(connectionReused);
141 WebURLLoadTiming WebURLResponse::loadTiming()
143 return WebURLLoadTiming(m_private->m_resourceResponse->resourceLoadTiming());
146 void WebURLResponse::setLoadTiming(const WebURLLoadTiming& timing)
148 RefPtr<ResourceLoadTiming> loadTiming = PassRefPtr<ResourceLoadTiming>(timing);
149 m_private->m_resourceResponse->setResourceLoadTiming(loadTiming.release());
152 WebHTTPLoadInfo WebURLResponse::httpLoadInfo()
154 return WebHTTPLoadInfo(m_private->m_resourceResponse->resourceLoadInfo());
157 void WebURLResponse::setHTTPLoadInfo(const WebHTTPLoadInfo& value)
159 m_private->m_resourceResponse->setResourceLoadInfo(value);
162 double WebURLResponse::responseTime() const
164 return m_private->m_resourceResponse->responseTime();
167 void WebURLResponse::setResponseTime(double responseTime)
169 m_private->m_resourceResponse->setResponseTime(responseTime);
172 WebString WebURLResponse::mimeType() const
174 return m_private->m_resourceResponse->mimeType();
177 void WebURLResponse::setMIMEType(const WebString& mimeType)
179 m_private->m_resourceResponse->setMimeType(mimeType);
182 long long WebURLResponse::expectedContentLength() const
184 return m_private->m_resourceResponse->expectedContentLength();
187 void WebURLResponse::setExpectedContentLength(long long expectedContentLength)
189 m_private->m_resourceResponse->setExpectedContentLength(expectedContentLength);
192 WebString WebURLResponse::textEncodingName() const
194 return m_private->m_resourceResponse->textEncodingName();
197 void WebURLResponse::setTextEncodingName(const WebString& textEncodingName)
199 m_private->m_resourceResponse->setTextEncodingName(textEncodingName);
202 WebString WebURLResponse::suggestedFileName() const
204 return m_private->m_resourceResponse->suggestedFilename();
207 void WebURLResponse::setSuggestedFileName(const WebString& suggestedFileName)
209 m_private->m_resourceResponse->setSuggestedFilename(suggestedFileName);
212 WebURLResponse::HTTPVersion WebURLResponse::httpVersion() const
214 return static_cast<HTTPVersion>(m_private->m_resourceResponse->httpVersion());
217 void WebURLResponse::setHTTPVersion(HTTPVersion version)
219 m_private->m_resourceResponse->setHTTPVersion(static_cast<ResourceResponse::HTTPVersion>(version));
222 int WebURLResponse::httpStatusCode() const
224 return m_private->m_resourceResponse->httpStatusCode();
227 void WebURLResponse::setHTTPStatusCode(int httpStatusCode)
229 m_private->m_resourceResponse->setHTTPStatusCode(httpStatusCode);
232 WebString WebURLResponse::httpStatusText() const
234 return m_private->m_resourceResponse->httpStatusText();
237 void WebURLResponse::setHTTPStatusText(const WebString& httpStatusText)
239 m_private->m_resourceResponse->setHTTPStatusText(httpStatusText);
242 WebString WebURLResponse::httpHeaderField(const WebString& name) const
244 return m_private->m_resourceResponse->httpHeaderField(name);
247 void WebURLResponse::setHTTPHeaderField(const WebString& name, const WebString& value)
249 m_private->m_resourceResponse->setHTTPHeaderField(name, value);
252 void WebURLResponse::addHTTPHeaderField(const WebString& name, const WebString& value)
254 if (name.isNull() || value.isNull())
257 m_private->m_resourceResponse->addHTTPHeaderField(name, value);
260 void WebURLResponse::clearHTTPHeaderField(const WebString& name)
262 m_private->m_resourceResponse->clearHTTPHeaderField(name);
265 void WebURLResponse::visitHTTPHeaderFields(WebHTTPHeaderVisitor* visitor) const
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);
272 double WebURLResponse::lastModifiedDate() const
274 return static_cast<double>(m_private->m_resourceResponse->lastModifiedDate());
277 void WebURLResponse::setLastModifiedDate(double lastModifiedDate)
279 m_private->m_resourceResponse->setLastModifiedDate(static_cast<time_t>(lastModifiedDate));
282 long long WebURLResponse::appCacheID() const
284 return m_private->m_resourceResponse->appCacheID();
287 void WebURLResponse::setAppCacheID(long long appCacheID)
289 m_private->m_resourceResponse->setAppCacheID(appCacheID);
292 WebURL WebURLResponse::appCacheManifestURL() const
294 return m_private->m_resourceResponse->appCacheManifestURL();
297 void WebURLResponse::setAppCacheManifestURL(const WebURL& url)
299 m_private->m_resourceResponse->setAppCacheManifestURL(url);
302 WebCString WebURLResponse::securityInfo() const
304 // FIXME: getSecurityInfo is misnamed.
305 return m_private->m_resourceResponse->getSecurityInfo();
308 void WebURLResponse::setSecurityInfo(const WebCString& securityInfo)
310 m_private->m_resourceResponse->setSecurityInfo(securityInfo);
313 ResourceResponse& WebURLResponse::toMutableResourceResponse()
316 ASSERT(m_private->m_resourceResponse);
318 return *m_private->m_resourceResponse;
321 const ResourceResponse& WebURLResponse::toResourceResponse() const
324 ASSERT(m_private->m_resourceResponse);
326 return *m_private->m_resourceResponse;
329 bool WebURLResponse::wasCached() const
331 return m_private->m_resourceResponse->wasCached();
334 void WebURLResponse::setWasCached(bool value)
336 m_private->m_resourceResponse->setWasCached(value);
339 bool WebURLResponse::wasFetchedViaSPDY() const
341 return m_private->m_resourceResponse->wasFetchedViaSPDY();
344 void WebURLResponse::setWasFetchedViaSPDY(bool value)
346 m_private->m_resourceResponse->setWasFetchedViaSPDY(value);
349 bool WebURLResponse::wasNpnNegotiated() const
351 return m_private->m_resourceResponse->wasNpnNegotiated();
354 void WebURLResponse::setWasNpnNegotiated(bool value)
356 m_private->m_resourceResponse->setWasNpnNegotiated(value);
359 bool WebURLResponse::wasAlternateProtocolAvailable() const
361 return m_private->m_resourceResponse->wasAlternateProtocolAvailable();
364 void WebURLResponse::setWasAlternateProtocolAvailable(bool value)
366 m_private->m_resourceResponse->setWasAlternateProtocolAvailable(value);
369 bool WebURLResponse::wasFetchedViaProxy() const
371 return m_private->m_resourceResponse->wasFetchedViaProxy();
374 void WebURLResponse::setWasFetchedViaProxy(bool value)
376 m_private->m_resourceResponse->setWasFetchedViaProxy(value);
379 bool WebURLResponse::wasFetchedViaServiceWorker() const
381 return m_private->m_resourceResponse->wasFetchedViaServiceWorker();
384 void WebURLResponse::setWasFetchedViaServiceWorker(bool value)
386 m_private->m_resourceResponse->setWasFetchedViaServiceWorker(value);
389 bool WebURLResponse::wasFallbackRequiredByServiceWorker() const
391 return m_private->m_resourceResponse->wasFallbackRequiredByServiceWorker();
394 void WebURLResponse::setWasFallbackRequiredByServiceWorker(bool value)
396 m_private->m_resourceResponse->setWasFallbackRequiredByServiceWorker(value);
399 WebServiceWorkerResponseType WebURLResponse::serviceWorkerResponseType() const
401 return m_private->m_resourceResponse->serviceWorkerResponseType();
404 void WebURLResponse::setServiceWorkerResponseType(WebServiceWorkerResponseType value)
406 m_private->m_resourceResponse->setServiceWorkerResponseType(value);
409 bool WebURLResponse::isMultipartPayload() const
411 return m_private->m_resourceResponse->isMultipartPayload();
414 void WebURLResponse::setIsMultipartPayload(bool value)
416 m_private->m_resourceResponse->setIsMultipartPayload(value);
419 WebString WebURLResponse::downloadFilePath() const
421 return m_private->m_resourceResponse->downloadedFilePath();
424 void WebURLResponse::setDownloadFilePath(const WebString& downloadFilePath)
426 m_private->m_resourceResponse->setDownloadedFilePath(downloadFilePath);
429 WebString WebURLResponse::remoteIPAddress() const
431 return m_private->m_resourceResponse->remoteIPAddress();
434 void WebURLResponse::setRemoteIPAddress(const WebString& remoteIPAddress)
436 m_private->m_resourceResponse->setRemoteIPAddress(remoteIPAddress);
439 unsigned short WebURLResponse::remotePort() const
441 return m_private->m_resourceResponse->remotePort();
444 void WebURLResponse::setRemotePort(unsigned short remotePort)
446 m_private->m_resourceResponse->setRemotePort(remotePort);
449 WebURLResponse::ExtraData* WebURLResponse::extraData() const
451 RefPtr<ResourceResponse::ExtraData> data = m_private->m_resourceResponse->extraData();
454 return static_cast<ExtraDataContainer*>(data.get())->extraData();
457 void WebURLResponse::setExtraData(WebURLResponse::ExtraData* extraData)
459 m_private->m_resourceResponse->setExtraData(ExtraDataContainer::create(extraData));
462 void WebURLResponse::assign(WebURLResponsePrivate* p)
464 // Subclasses may call this directly so a self-assignment check is needed
465 // here as well as in the public assign method.
469 m_private->dispose();