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