668b463e672a457ce4fee586e8ebb43850fd41cb
[WebKit-https.git] / Source / WebKit2 / WebProcess / Network / WebResourceLoader.cpp
1 /*
2  * Copyright (C) 2012 Apple 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
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebResourceLoader.h"
28
29 #if ENABLE(NETWORK_PROCESS)
30
31 #include "DataReference.h"
32 #include "Logging.h"
33 #include "NetworkConnectionToWebProcessMessages.h"
34 #include "NetworkProcessConnection.h"
35 #include "NetworkResourceLoaderMessages.h"
36 #include "PlatformCertificateInfo.h"
37 #include "WebCoreArgumentCoders.h"
38 #include "WebErrors.h"
39 #include "WebProcess.h"
40 #include <WebCore/AuthenticationChallenge.h>
41 #include <WebCore/ResourceLoader.h>
42
43 using namespace WebCore;
44
45 namespace WebKit {
46
47 PassRefPtr<WebResourceLoader> WebResourceLoader::create(PassRefPtr<ResourceLoader> coreLoader)
48 {
49     return adoptRef(new WebResourceLoader(coreLoader));
50 }
51
52 WebResourceLoader::WebResourceLoader(PassRefPtr<WebCore::ResourceLoader> coreLoader)
53     : m_coreLoader(coreLoader)
54 {
55 }
56
57 WebResourceLoader::~WebResourceLoader()
58 {
59 }
60
61 CoreIPC::Connection* WebResourceLoader::connection() const
62 {
63     return WebProcess::shared().networkConnection()->connection();
64 }
65
66 uint64_t WebResourceLoader::destinationID() const
67 {
68     return m_coreLoader->identifier();
69 }
70
71 void WebResourceLoader::cancelResourceLoader()
72 {
73     m_coreLoader->cancel();
74 }
75
76 void WebResourceLoader::willSendRequest(const ResourceRequest& proposedRequest, const ResourceResponse& redirectResponse, ResourceRequest& newRequest)
77 {
78     LOG(Network, "(WebProcess) WebResourceLoader::willSendRequest to '%s'", proposedRequest.url().string().utf8().data());
79     
80     newRequest = proposedRequest;
81     m_coreLoader->willSendRequest(newRequest, redirectResponse);
82 }
83
84 void WebResourceLoader::didReceiveResponseWithCertificateInfo(const ResourceResponse& response, const PlatformCertificateInfo& certificateInfo)
85 {
86     LOG(Network, "(WebProcess) WebResourceLoader::didReceiveResponseWithCertificateInfo for '%s'. Status %d.", m_coreLoader->url().string().utf8().data(), response.httpStatusCode());
87     ResourceResponse responseCopy(response);
88     responseCopy.setCertificateChain(certificateInfo.certificateChain());
89     m_coreLoader->didReceiveResponse(responseCopy);
90 }
91
92 void WebResourceLoader::didReceiveData(const CoreIPC::DataReference& data, int64_t encodedDataLength, bool allAtOnce)
93 {
94     LOG(Network, "(WebProcess) WebResourceLoader::didReceiveData of size %i for '%s'", (int)data.size(), m_coreLoader->url().string().utf8().data());
95     m_coreLoader->didReceiveData(reinterpret_cast<const char*>(data.data()), data.size(), encodedDataLength, allAtOnce);
96 }
97
98 void WebResourceLoader::didFinishResourceLoad(double finishTime)
99 {
100     LOG(Network, "(WebProcess) WebResourceLoader::didFinishResourceLoad for '%s'", m_coreLoader->url().string().utf8().data());
101     m_coreLoader->didFinishLoading(finishTime);
102 }
103
104 void WebResourceLoader::didFailResourceLoad(const ResourceError& error)
105 {
106     LOG(Network, "(WebProcess) WebResourceLoader::didFailResourceLoad for '%s'", m_coreLoader->url().string().utf8().data());
107     
108     m_coreLoader->didFail(error);
109 }
110
111 void WebResourceLoader::didReceiveResource(const ShareableResource::Handle& handle, double finishTime)
112 {
113     LOG(Network, "(WebProcess) WebResourceLoader::didReceiveResource for '%s'", m_coreLoader->url().string().utf8().data());
114
115     RefPtr<ShareableResource> resource = ShareableResource::create(handle);
116
117     // Only send data to the didReceiveData callback if it exists.
118     if (!resource->size()) {
119         // FIXME (NetworkProcess): Give ResourceLoader the ability to take ResourceBuffer arguments.
120         // That will allow us to pass it along to CachedResources and allow them to hang on to the shared memory behind the scenes.
121         // FIXME (NetworkProcess): Pass along the correct value for encodedDataLength.
122         m_coreLoader->didReceiveData(reinterpret_cast<const char*>(resource->data()), resource->size(), -1 /* encodedDataLength */ , true);
123     }
124
125     m_coreLoader->didFinishLoading(finishTime);
126 }
127
128 void WebResourceLoader::canAuthenticateAgainstProtectionSpace(const ProtectionSpace& protectionSpace, bool& result)
129 {
130     result = m_coreLoader->canAuthenticateAgainstProtectionSpace(protectionSpace);
131 }
132
133 void WebResourceLoader::didReceiveAuthenticationChallenge(const AuthenticationChallenge& challenge)
134 {
135     LOG(Network, "(WebProcess) WebResourceLoader::didReceiveAuthenticationChallenge for '%s'", m_coreLoader->url().string().utf8().data());
136
137     m_currentAuthenticationChallenge = adoptPtr(new AuthenticationChallenge(challenge));
138     m_currentAuthenticationChallenge->setAuthenticationClient(this);
139
140     m_coreLoader->didReceiveAuthenticationChallenge(*m_currentAuthenticationChallenge);
141 }
142
143 void WebResourceLoader::didCancelAuthenticationChallenge(const AuthenticationChallenge& challenge)
144 {
145     if (m_currentAuthenticationChallenge->identifier() != challenge.identifier())
146         return;
147
148     LOG(Network, "(WebProcess) WebResourceLoader::didCancelAuthenticationChallenge for '%s'", m_coreLoader->url().string().utf8().data());
149
150     m_coreLoader->didCancelAuthenticationChallenge(*m_currentAuthenticationChallenge);
151     m_currentAuthenticationChallenge.clear();
152 }
153
154 // WebCore::AuthenticationClient
155 void WebResourceLoader::receivedCredential(const AuthenticationChallenge& challenge, const Credential& credential)
156 {
157     ASSERT(m_currentAuthenticationChallenge && challenge == *m_currentAuthenticationChallenge);
158     send(Messages::NetworkResourceLoader::ReceivedAuthenticationCredential(challenge, credential));
159
160     m_currentAuthenticationChallenge.clear();
161 }
162
163 void WebResourceLoader::receivedRequestToContinueWithoutCredential(const AuthenticationChallenge& challenge)
164 {
165     ASSERT(m_currentAuthenticationChallenge && challenge == *m_currentAuthenticationChallenge);
166     send(Messages::NetworkResourceLoader::ReceivedRequestToContinueWithoutAuthenticationCredential(challenge));
167
168     m_currentAuthenticationChallenge.clear();
169 }
170
171 void WebResourceLoader::receivedCancellation(const AuthenticationChallenge& challenge)
172 {
173     ASSERT(m_currentAuthenticationChallenge && challenge == *m_currentAuthenticationChallenge);
174     send(Messages::NetworkResourceLoader::ReceivedAuthenticationCancellation(challenge));
175
176     m_currentAuthenticationChallenge.clear();
177 }
178
179 void WebResourceLoader::networkProcessCrashed()
180 {
181     ASSERT(m_coreLoader);
182     m_coreLoader->didFail(internalError(m_coreLoader->url()));
183 }
184
185 } // namespace WebKit
186
187 #endif // ENABLE(NETWORK_PROCESS)