void WebRequest::OnReceivedRedirect(URLRequest* newRequest, const GURL& newUrl, bool* deferRedirect)
{
ASSERT(m_loadState < Response, "Redirect after receiving response");
+ ASSERT(newRequest && newRequest->status().is_success(), "Invalid redirect");
- if (newRequest && newRequest->status().is_success()) {
- OwnPtr<WebResponse> webResponse(new WebResponse(newRequest));
- webResponse->setUrl(newUrl.spec());
- m_urlLoader->maybeCallOnMainThread(NewRunnableMethod(
- m_urlLoader.get(), &WebUrlLoaderClient::willSendRequest, webResponse.release()));
- } else {
- // why would this happen? And what to do?
- }
+ OwnPtr<WebResponse> webResponse(new WebResponse(newRequest));
+ webResponse->setUrl(newUrl.spec());
+ m_urlLoader->maybeCallOnMainThread(NewRunnableMethod(
+ m_urlLoader.get(), &WebUrlLoaderClient::willSendRequest, webResponse.release()));
- // Here we should check if the url we get back from webkit is the same
- // as newUrl, but since we are on a different thread that is not
- // possible. Look into later.
- return;
+ // Defer the redirect until followDeferredRedirect() is called.
+ *deferRedirect = true;
}
// Called when we receive an authentication failure. The delegate should
m_request->CancelAuth();
}
+void WebRequest::followDeferredRedirect()
+{
+ ASSERT(m_loadState < Response, "Redirect after receiving response");
+
+ m_request->FollowDeferredRedirect();
+}
+
void WebRequest::startReading()
{
ASSERT(m_loadState == Response || m_loadState == GotData, "StartReading in state other than RESPONSE and GOTDATA");
if (!isActive())
return;
- OwnPtr<WebCore::ResourceRequest> resourceRequest(new WebCore::ResourceRequest(webResponse->createKurl()));
+ KURL url = webResponse->createKurl();
+ OwnPtr<WebCore::ResourceRequest> resourceRequest(new WebCore::ResourceRequest(url));
m_resourceHandle->client()->willSendRequest(m_resourceHandle.get(), *resourceRequest, webResponse->createResourceResponse());
+
+ // WebKit may have killed the request.
+ if (!isActive())
+ return;
+
+ // Like Chrome, we only follow the redirect if WebKit left the URL unmodified.
+ if (url == resourceRequest->url()) {
+ ioThread()->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request.get(), &WebRequest::followDeferredRedirect));
+ } else {
+ cancel();
+ }
}
void WebUrlLoaderClient::didFinishLoading()