void NetworkResourceLoader::start() { ASSERT(RunLoop::isMain()); if (m_defersLoading) return; m_currentRequest = originalRequest(); #if ENABLE(NETWORK_CACHE) if (!NetworkCache::singleton().isEnabled() || sessionID().isEphemeral() || !originalRequest().url().protocolIsInHTTPFamily()) { startNetworkLoad(); return; } RefPtr<NetworkResourceLoader> loader(this); NetworkCache::singleton().retrieve(originalRequest(), m_parameters.webPageID, [loader](std::unique_ptr<NetworkCache::Entry> entry) { if (loader->hasOneRef()) { // The loader has been aborted and is only held alive by this lambda. return; } if (!entry) { loader->startNetworkLoad(); return; } if (loader->m_parameters.needsCertificateInfo && !entry->response().containsCertificateInfo()) { loader->startNetworkLoad(); return; } if (entry->needsValidation()) { loader->validateCacheEntry(WTF::move(entry)); return; } loader->didRetrieveCacheEntry(WTF::move(entry)); }); #else startNetworkLoad(); #endif }
void NetworkResourceLoader::start() { ASSERT(RunLoop::isMain()); if (m_defersLoading) return; #if ENABLE(NETWORK_CACHE) if (canUseCache(originalRequest())) { retrieveCacheEntry(originalRequest()); return; } #endif startNetworkLoad(originalRequest()); }
void NetworkResourceLoader::continueWillSendRequest(const ResourceRequest& newRequest) { #if ENABLE(NETWORK_CACHE) if (m_isWaitingContinueWillSendRequestForCachedRedirect) { LOG(NetworkCache, "(NetworkProcess) Retrieving cached redirect"); if (canUseCachedRedirect(newRequest)) retrieveCacheEntry(newRequest); else startNetworkLoad(newRequest); m_isWaitingContinueWillSendRequestForCachedRedirect = false; return; } #endif m_networkLoad->continueWillSendRequest(newRequest); }
void NetworkResourceLoader::start() { ASSERT(RunLoop::isMain()); if (m_defersLoading) { RELEASE_LOG_IF_ALLOWED("start: Loading is deferred (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", isMainResource = %d, isSynchronous = %d)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, isMainResource(), isSynchronous()); return; } #if ENABLE(NETWORK_CACHE) if (canUseCache(originalRequest())) { RELEASE_LOG_IF_ALLOWED("start: Retrieving resource from cache (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", isMainResource = %d, isSynchronous = %d)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, isMainResource(), isSynchronous()); retrieveCacheEntry(originalRequest()); return; } #endif startNetworkLoad(originalRequest()); }
void NetworkResourceLoader::continueWillSendRequest(const ResourceRequest& newRequest) { NETWORKRESOURCELOADER_LOG_ALWAYS("Following redirect of network resource: loader = %p, pageID = %llu, frameID = %llu, isMainResource = %d, isSynchronous = %d", this, static_cast<unsigned long long>(m_parameters.webPageID), static_cast<unsigned long long>(m_parameters.webFrameID), isMainResource(), isSynchronous()); #if ENABLE(NETWORK_CACHE) if (m_isWaitingContinueWillSendRequestForCachedRedirect) { LOG(NetworkCache, "(NetworkProcess) Retrieving cached redirect"); if (canUseCachedRedirect(newRequest)) retrieveCacheEntry(newRequest); else startNetworkLoad(newRequest); m_isWaitingContinueWillSendRequestForCachedRedirect = false; return; } #endif m_networkLoad->continueWillSendRequest(newRequest); }
void NetworkResourceLoader::validateCacheEntry(std::unique_ptr<NetworkCache::Entry> entry) { ASSERT(!m_networkLoad); // If the request is already conditional then the revalidation was not triggered by the disk cache // and we should not overwrite the existing conditional headers. ResourceRequest revalidationRequest = originalRequest(); if (!revalidationRequest.isConditional()) { String eTag = entry->response().httpHeaderField(HTTPHeaderName::ETag); String lastModified = entry->response().httpHeaderField(HTTPHeaderName::LastModified); if (!eTag.isEmpty()) revalidationRequest.setHTTPHeaderField(HTTPHeaderName::IfNoneMatch, eTag); if (!lastModified.isEmpty()) revalidationRequest.setHTTPHeaderField(HTTPHeaderName::IfModifiedSince, lastModified); } m_cacheEntryForValidation = WTFMove(entry); startNetworkLoad(revalidationRequest); }
void NetworkResourceLoader::validateCacheEntry(std::unique_ptr<NetworkCache::Entry> entry) { #if !USE(NETWORK_SESSION) ASSERT(!m_handle); #endif // If the request is already conditional then the revalidation was not triggered by the disk cache // and we should not overwrite the existing conditional headers. if (!m_currentRequest.isConditional()) { String eTag = entry->response().httpHeaderField(WebCore::HTTPHeaderName::ETag); String lastModified = entry->response().httpHeaderField(WebCore::HTTPHeaderName::LastModified); if (!eTag.isEmpty()) m_currentRequest.setHTTPHeaderField(WebCore::HTTPHeaderName::IfNoneMatch, eTag); if (!lastModified.isEmpty()) m_currentRequest.setHTTPHeaderField(WebCore::HTTPHeaderName::IfModifiedSince, lastModified); } m_cacheEntryForValidation = WTF::move(entry); startNetworkLoad(); }
void NetworkResourceLoader::continueWillSendRequest(ResourceRequest&& newRequest) { RELEASE_LOG_IF_ALLOWED("continueWillSendRequest: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier); // If there is a match in the network cache, we need to reuse the original cache policy. newRequest.setCachePolicy(originalRequest().cachePolicy()); #if ENABLE(NETWORK_CACHE) if (m_isWaitingContinueWillSendRequestForCachedRedirect) { LOG(NetworkCache, "(NetworkProcess) Retrieving cached redirect"); if (canUseCachedRedirect(newRequest)) retrieveCacheEntry(newRequest); else startNetworkLoad(newRequest); m_isWaitingContinueWillSendRequestForCachedRedirect = false; return; } #endif if (m_networkLoad) m_networkLoad->continueWillSendRequest(WTFMove(newRequest)); }