CFURLRequestRef ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(CFURLRequestRef cfRequest, CFURLResponseRef originalRedirectResponse) { // If the protocols of the new request and the current request match, this is not an HSTS redirect and we don't need to synthesize a redirect response. if (!originalRedirectResponse) { RetainPtr<CFStringRef> newScheme = adoptCF(CFURLCopyScheme(CFURLRequestGetURL(cfRequest))); if (CFStringCompare(newScheme.get(), m_originalScheme.get(), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { CFRetain(cfRequest); return cfRequest; } } RefPtr<ResourceHandleCFURLConnectionDelegateWithOperationQueue> protector(this); dispatch_async(dispatch_get_main_queue(), ^{ if (!protector->hasHandle()) { continueWillSendRequest(nullptr); return; } LOG(Network, "CFNet - ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(handle=%p) (%s)", m_handle, m_handle->firstRequest().url().string().utf8().data()); RetainPtr<CFURLResponseRef> redirectResponse = synthesizeRedirectResponseIfNecessary(cfRequest, originalRedirectResponse); ASSERT(redirectResponse); ResourceRequest request = createResourceRequest(cfRequest, redirectResponse.get()); m_handle->willSendRequest(request, redirectResponse.get()); });
CFURLRequestRef ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(CFURLRequestRef cfRequest, CFURLResponseRef originalRedirectResponse) { // If the protocols of the new request and the current request match, this is not an HSTS redirect and we don't need to synthesize a redirect response. if (!originalRedirectResponse) { RetainPtr<CFStringRef> newScheme = adoptCF(CFURLCopyScheme(CFURLRequestGetURL(cfRequest))); if (CFStringCompare(newScheme.get(), m_originalScheme.get(), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { CFRetain(cfRequest); return cfRequest; } } ASSERT(!isMainThread()); // FIXME: The block implicitly copies protector object, which is wasteful. We should just call ref(), // capture "this" by pointer value, and use a C++ lambda to prevent other unintentional capturing. RefPtr<ResourceHandleCFURLConnectionDelegateWithOperationQueue> protectedThis(this); dispatch_async(dispatch_get_main_queue(), ^{ if (!protectedThis->hasHandle()) { continueWillSendRequest(nullptr); return; } LOG(Network, "CFNet - ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(handle=%p) (%s)", m_handle, m_handle->firstRequest().url().string().utf8().data()); RetainPtr<CFURLResponseRef> redirectResponse = synthesizeRedirectResponseIfNecessary(cfRequest, originalRedirectResponse); ASSERT(redirectResponse); ResourceRequest request = createResourceRequest(cfRequest, redirectResponse.get()); m_handle->willSendRequest(request, redirectResponse.get()); });
void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request, WebCore::ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse) { ++m_redirectCount; if (isSynchronous()) { ResourceRequest overridenRequest = redirectRequest; // FIXME: This needs to be fixed to follow the redirect correctly even for cross-domain requests. // This includes at least updating host records, and comparing the current request instead of the original request here. if (!protocolHostAndPortAreEqual(originalRequest().url(), redirectRequest.url())) { ASSERT(m_synchronousLoadData->error.isNull()); m_synchronousLoadData->error = SynchronousLoaderClient::platformBadResponseError(); m_networkLoad->clearCurrentRequest(); overridenRequest = ResourceRequest(); } continueWillSendRequest(WTFMove(overridenRequest)); return; } send(Messages::WebResourceLoader::WillSendRequest(redirectRequest, redirectResponse)); #if ENABLE(NETWORK_CACHE) if (canUseCachedRedirect(request)) NetworkCache::singleton().storeRedirect(request, redirectResponse, redirectRequest); #else UNUSED_PARAM(request); #endif }
void NetworkResourceLoader::sharedWillSendRedirectedRequest(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& redirectResponse) { // We only expect to get the willSendRequest callback from ResourceHandle as the result of a redirect. ASSERT(!redirectResponse.isNull()); ASSERT(RunLoop::isMain()); m_currentRequest = request; #if ENABLE(NETWORK_CACHE) WebCore::updateRedirectChainStatus(m_redirectChainCacheStatus, redirectResponse); #endif if (isSynchronous()) { // FIXME: This needs to be fixed to follow the redirect correctly even for cross-domain requests. // This includes at least updating host records, and comparing the current request instead of the original request here. if (!protocolHostAndPortAreEqual(originalRequest().url(), m_currentRequest.url())) { ASSERT(m_synchronousLoadData->error.isNull()); m_synchronousLoadData->error = SynchronousLoaderClient::platformBadResponseError(); m_currentRequest = ResourceRequest(); } continueWillSendRequest(m_currentRequest); return; } sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(m_currentRequest, redirectResponse)); }
CFURLRequestRef ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(CFURLRequestRef cfRequest, CFURLResponseRef originalRedirectResponse) { RefPtr<ResourceHandleCFURLConnectionDelegateWithOperationQueue> protector(this); dispatch_async(dispatch_get_main_queue(), ^{ if (!protector->hasHandle()) { continueWillSendRequest(nullptr); return; } LOG(Network, "CFNet - ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(handle=%p) (%s)", m_handle, m_handle->firstRequest().url().string().utf8().data()); RetainPtr<CFURLResponseRef> redirectResponse = synthesizeRedirectResponseIfNecessary(cfRequest, originalRedirectResponse); if (!redirectResponse) { m_handle->continueWillSendRequest(cfRequest); return; } ResourceRequest request = createResourceRequest(cfRequest, redirectResponse.get()); m_handle->willSendRequest(request, redirectResponse.get()); });
void NetworkResourceLoader::willSendRequestAsync(ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& redirectResponse) { ASSERT_UNUSED(handle, handle == m_handle); // We only expect to get the willSendRequest callback from ResourceHandle as the result of a redirect. ASSERT(!redirectResponse.isNull()); ASSERT(RunLoop::isMain()); m_currentRequest = request; if (isSynchronous()) { // FIXME: This needs to be fixed to follow the redirect correctly even for cross-domain requests. // This includes at least updating host records, and comparing the current request instead of the original request here. if (!protocolHostAndPortAreEqual(originalRequest().url(), request.url())) { ASSERT(m_synchronousLoadData->error.isNull()); m_synchronousLoadData->error = SynchronousLoaderClient::platformBadResponseError(); m_currentRequest = ResourceRequest(); } continueWillSendRequest(m_currentRequest); return; } sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(request, redirectResponse)); }