1d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen/* 2d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * Copyright 2010, The Android Open Source Project 3d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * 4d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * Redistribution and use in source and binary forms, with or without 5d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * modification, are permitted provided that the following conditions 6d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * are met: 7d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * * Redistributions of source code must retain the above copyright 8d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * notice, this list of conditions and the following disclaimer. 9d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * * Redistributions in binary form must reproduce the above copyright 10d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * notice, this list of conditions and the following disclaimer in the 11d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * documentation and/or other materials provided with the distribution. 12d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * 13d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen */ 25d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 26d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen#include "config.h" 27d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen#include "WebResourceRequest.h" 28d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 29d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen#include "ResourceRequest.h" 30d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 31d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen#include <wtf/text/CString.h> 32d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 33833804653e1cc85cc95b67838a544b676e7b5f3bShimeng (Simon) Wangusing namespace WebCore; 34833804653e1cc85cc95b67838a544b676e7b5f3bShimeng (Simon) Wang 35d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsennamespace android { 36d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 37e82298dad5b93e668a6dae26da91a7d2f942d0bbBen MurdochWebResourceRequest::WebResourceRequest(const WebCore::ResourceRequest& resourceRequest, bool shouldBlockNetworkLoads) 38d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen{ 399bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block // Set the load flags based on the WebCore request. 409bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block m_loadFlags = net::LOAD_NORMAL; 41e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch 42e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch if (shouldBlockNetworkLoads) { 43e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch // In the case that the embedder has blocked network loads, we only 44e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch // ever try to serve content out of the cache. If WebCore has set 45e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch // ReloadIgnoringCacheData, we would normally attempt to validate 46e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch // the cached data before serving it. In the absence of network 47e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch // we can't do that, so we will just return whatever we have in the 48e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch // cache (which may well be nothing). 499bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block m_loadFlags |= net::LOAD_ONLY_FROM_CACHE; 50e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch } else { 51e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch switch (resourceRequest.cachePolicy()) { 52e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch case ReloadIgnoringCacheData: 53e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch m_loadFlags |= net::LOAD_VALIDATE_CACHE; 54e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch break; 55e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch case ReturnCacheDataElseLoad: 56e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch m_loadFlags |= net::LOAD_PREFERRING_CACHE; 57e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch break; 58e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch case ReturnCacheDataDontLoad: 59e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch m_loadFlags |= net::LOAD_ONLY_FROM_CACHE; 60e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch break; 61e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch case UseProtocolCachePolicy: 62e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch break; 63e82298dad5b93e668a6dae26da91a7d2f942d0bbBen Murdoch } 649bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block } 659bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block 669bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block // TODO: We should consider setting these flags and net::LOAD_DO_NOT_SEND_AUTH_DATA 679bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block // when FrameLoaderClient::shouldUseCredentialStorage() is false. However, 689bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block // the required WebKit logic is not yet in place. See Chromium's 699bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block // FrameLoaderClientImpl::shouldUseCredentialStorage(). 709bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block if (!resourceRequest.allowCookies()) { 719bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block m_loadFlags |= net::LOAD_DO_NOT_SAVE_COOKIES; 729bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block m_loadFlags |= net::LOAD_DO_NOT_SEND_COOKIES; 739bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block } 749bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block 759bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block 76b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch switch (resourceRequest.targetType()) { 77b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch case ResourceRequest::TargetIsPrefetch: 78b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch m_loadFlags |= (net::LOAD_PREFETCH | net::LOAD_DO_NOT_PROMPT_FOR_LOGIN); 79b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch break; 80b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch case ResourceRequest::TargetIsFavicon: 81b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch m_loadFlags |= net::LOAD_DO_NOT_PROMPT_FOR_LOGIN; 82b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch break; 83b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch default: break; 84b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch } 85b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch 86b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch 87d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // Set the request headers 88833804653e1cc85cc95b67838a544b676e7b5f3bShimeng (Simon) Wang const HTTPHeaderMap& map = resourceRequest.httpHeaderFields(); 89833804653e1cc85cc95b67838a544b676e7b5f3bShimeng (Simon) Wang for (HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) { 90d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen const std::string& nameUtf8 = it->first.string().utf8().data(); 919bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block const std::string& valueUtf8 = it->second.utf8().data(); 92d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 93d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // Skip over referrer headers found in the header map because we already 94d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // pulled it out as a separate parameter. We likewise prune the UA since 95d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // that will be added back by the network layer. 96d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen if (LowerCaseEqualsASCII(nameUtf8, "referer") || LowerCaseEqualsASCII(nameUtf8, "user-agent")) 97d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen continue; 98d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 99d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // Skip over "Cache-Control: max-age=0" header if the corresponding 100d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // load flag is already specified. FrameLoader sets both the flag and 101d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // the extra header -- the extra header is redundant since our network 102d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // implementation will add the necessary headers based on load flags. 103d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen // See http://code.google.com/p/chromium/issues/detail?id=3434. 1049bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block if ((m_loadFlags & net::LOAD_VALIDATE_CACHE) && 1059bf5f54cd2daed5b9d96acb5af88a024b90ad32fSteve Block LowerCaseEqualsASCII(nameUtf8, "cache-control") && LowerCaseEqualsASCII(valueUtf8, "max-age=0")) 106d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen continue; 107d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 108a16f4e9ca1577e716a15120149de94106ef81536Kristian Monsen m_requestHeaders.SetHeader(nameUtf8, valueUtf8); 109d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen } 110d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 111d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen m_method = resourceRequest.httpMethod().utf8().data(); 112d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen m_referrer = resourceRequest.httpReferrer().utf8().data(); 113583f3b2e7b569ec9f88e9c481db1eb86a8c0224bIain Merrick m_userAgent = resourceRequest.httpUserAgent().utf8().data(); 114021eb475906bf08d90d93e6a3434fe2439e42cf0Kristian Monsen 115d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen m_url = resourceRequest.url().string().utf8().data(); 116d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen} 117d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen 118d8c0fb842299e8de5af02d608f46c4f7bd443b1eKristian Monsen} // namespace android 119