void NetworkResourceLoader::retrieveCacheEntry(const ResourceRequest& request) { ASSERT(canUseCache(request)); RefPtr<NetworkResourceLoader> loader(this); NetworkCache::singleton().retrieve(request, { m_parameters.webPageID, m_parameters.webFrameID }, [loader, request](auto entry) { if (loader->hasOneRef()) { // The loader has been aborted and is only held alive by this lambda. return; } if (!entry) { loader->startNetworkLoad(request); return; } if (entry->redirectRequest()) { loader->dispatchWillSendRequestForCacheEntry(WTFMove(entry)); return; } if (loader->m_parameters.needsCertificateInfo && !entry->response().certificateInfo()) { loader->startNetworkLoad(request); return; } if (entry->needsValidation() || request.cachePolicy() == WebCore::RefreshAnyCacheData) { loader->validateCacheEntry(WTFMove(entry)); return; } loader->didRetrieveCacheEntry(WTFMove(entry)); }); }
bool NetworkResourceLoader::canUseCachedRedirect(const ResourceRequest& request) const { if (!canUseCache(request)) return false; // Limit cached redirects to avoid cycles and other trouble. // Networking layer follows over 30 redirects but caching that many seems unnecessary. static const unsigned maximumCachedRedirectCount { 5 }; if (m_redirectCount > maximumCachedRedirectCount) return false; return true; }
void NetworkResourceLoader::tryStoreAsCacheEntry() { if (!canUseCache(m_networkLoad->currentRequest())) return; if (!m_bufferedDataForCache) return; NetworkCache::singleton().store(m_networkLoad->currentRequest(), m_response, WTFMove(m_bufferedDataForCache), [loader = makeRef(*this)](auto& mappedBody) mutable { #if ENABLE(SHAREABLE_RESOURCE) if (mappedBody.shareableResourceHandle.isNull()) return; LOG(NetworkCache, "(NetworkProcess) sending DidCacheResource"); loader->send(Messages::NetworkProcessConnection::DidCacheResource(loader->originalRequest(), mappedBody.shareableResourceHandle, loader->sessionID())); #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::abort() { ASSERT(RunLoop::isMain()); if (m_networkLoad && !m_didConvertToDownload) { #if ENABLE(NETWORK_CACHE) if (canUseCache(m_networkLoad->currentRequest())) { // We might already have used data from this incomplete load. Ensure older versions don't remain in the cache after cancel. if (!m_response.isNull()) NetworkCache::singleton().remove(m_networkLoad->currentRequest()); } #endif m_networkLoad->cancel(); } cleanup(); }
void NetworkResourceLoader::startNetworkLoad(const ResourceRequest& request) { consumeSandboxExtensions(); if (isSynchronous() || m_parameters.maximumBufferingTime > 0_ms) m_bufferedData = SharedBuffer::create(); #if ENABLE(NETWORK_CACHE) if (canUseCache(request)) m_bufferedDataForCache = SharedBuffer::create(); #endif NetworkLoadParameters parameters = m_parameters; parameters.defersLoading = m_defersLoading; parameters.request = request; m_networkLoad = std::make_unique<NetworkLoad>(*this, parameters); }
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::tryStoreAsCacheEntry() { if (!canUseCache(m_networkLoad->currentRequest())) return; if (!m_bufferedDataForCache) return; // Keep the connection alive. RefPtr<NetworkConnectionToWebProcess> connection(&connectionToWebProcess()); RefPtr<NetworkResourceLoader> loader(this); NetworkCache::singleton().store(m_networkLoad->currentRequest(), m_response, WTFMove(m_bufferedDataForCache), [loader, connection](NetworkCache::MappedBody& mappedBody) { #if ENABLE(SHAREABLE_RESOURCE) if (mappedBody.shareableResourceHandle.isNull()) return; LOG(NetworkCache, "(NetworkProcess) sending DidCacheResource"); loader->send(Messages::NetworkProcessConnection::DidCacheResource(loader->originalRequest(), mappedBody.shareableResourceHandle, loader->sessionID())); #endif }); }
void NetworkResourceLoader::startNetworkLoad(const ResourceRequest& request) { consumeSandboxExtensions(); if (isSynchronous() || m_parameters.maximumBufferingTime > 0_ms) m_bufferedData = SharedBuffer::create(); #if ENABLE(NETWORK_CACHE) if (canUseCache(request)) m_bufferedDataForCache = SharedBuffer::create(); #endif NETWORKRESOURCELOADER_LOG_ALWAYS("Starting network resource load: loader = %p, pageID = %llu, frameID = %llu, isMainResource = %d, isSynchronous = %d", this, m_parameters.webPageID, m_parameters.webFrameID, isMainResource(), isSynchronous()); NetworkLoadParameters parameters = m_parameters; parameters.defersLoading = m_defersLoading; parameters.request = request; m_networkLoad = std::make_unique<NetworkLoad>(*this, parameters); }
void NetworkResourceLoader::abort() { ASSERT(RunLoop::isMain()); RELEASE_LOG_IF_ALLOWED("abort: Canceling resource load (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier); if (m_networkLoad) { #if ENABLE(NETWORK_CACHE) if (canUseCache(m_networkLoad->currentRequest())) { // We might already have used data from this incomplete load. Ensure older versions don't remain in the cache after cancel. if (!m_response.isNull()) NetworkCache::singleton().remove(m_networkLoad->currentRequest()); } #endif m_networkLoad->cancel(); } cleanup(); }
void NetworkResourceLoader::startNetworkLoad(const ResourceRequest& request) { RELEASE_LOG_IF_ALLOWED("startNetworkLoad: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", isMainResource = %d, isSynchronous = %d)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, isMainResource(), isSynchronous()); consumeSandboxExtensions(); if (isSynchronous() || m_parameters.maximumBufferingTime > 0ms) m_bufferedData = SharedBuffer::create(); #if ENABLE(NETWORK_CACHE) if (canUseCache(request)) m_bufferedDataForCache = SharedBuffer::create(); #endif NetworkLoadParameters parameters = m_parameters; parameters.defersLoading = m_defersLoading; parameters.request = request; #if USE(NETWORK_SESSION) if (request.url().protocolIsBlob()) parameters.blobFileReferences = NetworkBlobRegistry::singleton().filesInBlob(m_connection, originalRequest().url()); auto* networkSession = SessionTracker::networkSession(parameters.sessionID); if (!networkSession) { WTFLogAlways("Attempted to create a NetworkLoad with a session (id=%" PRIu64 ") that does not exist.", parameters.sessionID.sessionID()); RELEASE_LOG_ERROR_IF_ALLOWED("startNetworkLoad: Attempted to create a NetworkLoad with a session that does not exist (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", sessionID=%" PRIu64 ")", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, parameters.sessionID.sessionID()); NetworkProcess::singleton().logDiagnosticMessage(m_parameters.webPageID, WebCore::DiagnosticLoggingKeys::internalErrorKey(), WebCore::DiagnosticLoggingKeys::invalidSessionIDKey(), WebCore::ShouldSample::No); didFailLoading(internalError(request.url())); return; } m_networkLoad = std::make_unique<NetworkLoad>(*this, WTFMove(parameters), *networkSession); #else m_networkLoad = std::make_unique<NetworkLoad>(*this, WTFMove(parameters)); #endif if (m_defersLoading) { RELEASE_LOG_IF_ALLOWED("startNetworkLoad: Created, but deferred (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier); } }