Changeset 194313 in webkit
- Timestamp:
- Dec 19, 2015 5:26:38 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r194306 r194313 1 2015-12-18 Antti Koivisto <antti@apple.com> 2 3 Cache redirects as separate entries 4 https://bugs.webkit.org/show_bug.cgi?id=152424 5 6 Reviewed by Alex Christensen. 7 8 * http/tests/cache/disk-cache/disk-cache-redirect-expected.txt: Added. 9 * http/tests/cache/disk-cache/disk-cache-redirect.html: Added. 10 * http/tests/cache/disk-cache/resources/generate-response.cgi: 11 1 12 2015-12-18 Michael Catanzaro <mcatanzaro@igalia.com> 2 13 -
trunk/LayoutTests/http/tests/cache/disk-cache/resources/generate-response.cgi
r189177 r194313 9 9 my $delay = $query->param('delay') || 0; 10 10 my $body = $query->param('body') || 0; 11 my $status = $query->param('Status') || 0; 11 12 12 13 if ($body eq "unique") { … … 15 16 16 17 my $hasStatusCode = 0; 18 my $hasLocation = 0; 19 if ($status == 301 || $status == 302 || $status == 303 || $status == 307) { 20 if ($query->param('Location') eq "unique-cacheable") { 21 my $redirectBody = sprintf "%08X", rand(0xffffffff); 22 print "Status: ". $status . "\n"; 23 print "Location: generate-response.cgi?body=" . $redirectBody . "&Cache-control=max-age%3D1000&uniqueId=" . $query->param('uniqueId') . "\n"; 24 $hasLocation = 1; 25 $hasStatusCode = 1; 26 } 27 } 28 17 29 my $hasExpiresHeader = 0; 18 30 if ($query->http && $query->http("If-None-Match") eq "match") { … … 30 42 print "Status: 206\n"; 31 43 } else { 32 44 print "Status: 416\n"; 33 45 } 34 46 … … 40 52 next if ($_ eq "delay"); 41 53 next if ($_ eq "body"); 54 next if ($_ eq "Location" and $hasLocation); 42 55 next if ($_ eq "Status" and $hasStatusCode); 43 56 next if ($_ eq "Expires" and $hasExpiresHeader); -
trunk/Source/WebCore/ChangeLog
r194305 r194313 1 2015-12-18 Antti Koivisto <antti@apple.com> 2 3 Cache redirects as separate entries 4 https://bugs.webkit.org/show_bug.cgi?id=152424 5 6 Reviewed by Alex Christensen. 7 8 Test: http/tests/cache/disk-cache/disk-cache-redirect.html 9 10 * platform/network/ResourceRequestBase.h: 11 1 12 2015-12-18 Per Arne Vollan <peavo@outlook.com> 2 13 -
trunk/Source/WebCore/platform/network/ResourceRequestBase.h
r192995 r194313 55 55 WTF_MAKE_FAST_ALLOCATED; 56 56 public: 57 static std::unique_ptr<ResourceRequest> adopt(std::unique_ptr<CrossThreadResourceRequestData>);57 WEBCORE_EXPORT static std::unique_ptr<ResourceRequest> adopt(std::unique_ptr<CrossThreadResourceRequestData>); 58 58 59 59 // Gets a copy of the data suitable for passing to another thread. 60 std::unique_ptr<CrossThreadResourceRequestData> copyData() const;60 WEBCORE_EXPORT std::unique_ptr<CrossThreadResourceRequestData> copyData() const; 61 61 62 62 WEBCORE_EXPORT bool isNull() const; -
trunk/Source/WebKit2/ChangeLog
r194303 r194313 1 2015-12-18 Antti Koivisto <antti@apple.com> 2 3 Cache redirects as separate entries 4 https://bugs.webkit.org/show_bug.cgi?id=152424 5 6 Reviewed by Alex Christensen. 7 8 We are currently caching redirect chains. This has correctness issues and can be inefficient in cases 9 where multiple URLs redirect to the same destination. 10 11 After this patch we write a cache entry for each redirect individually. 12 13 * NetworkProcess/NetworkLoad.cpp: 14 (WebKit::NetworkLoad::sharedWillSendRedirectedRequest): 15 * NetworkProcess/NetworkLoad.h: 16 (WebKit::NetworkLoad::currentRequest): 17 (WebKit::NetworkLoad::clearCurrentRequest): 18 * NetworkProcess/NetworkLoadClient.h: 19 20 Add original request as a parameter for willSendRedirectedRequest. 21 22 * NetworkProcess/NetworkResourceLoader.cpp: 23 (WebKit::NetworkResourceLoader::~NetworkResourceLoader): 24 (WebKit::NetworkResourceLoader::canUseCache): 25 26 Factor to a function. 27 28 (WebKit::NetworkResourceLoader::isSynchronous): 29 (WebKit::NetworkResourceLoader::start): 30 (WebKit::NetworkResourceLoader::retrieveCacheEntry): 31 32 Factor to a function. 33 Call dispatchWillSendRequestForCacheEntry for cached redirects. 34 35 (WebKit::NetworkResourceLoader::startNetworkLoad): 36 37 Make this take request as argument instead of always loading originalRequest(). 38 39 (WebKit::NetworkResourceLoader::abort): 40 (WebKit::NetworkResourceLoader::didFinishLoading): 41 42 Remove redirect chain code. 43 Store cache entry for current request instead of the original request. 44 45 (WebKit::NetworkResourceLoader::didFailLoading): 46 (WebKit::NetworkResourceLoader::willSendRedirectedRequest): 47 48 Write cache entry for redirect. 49 50 (WebKit::NetworkResourceLoader::continueWillSendRequest): 51 52 If we are playing back cached redirect continue with another cache lookup. 53 54 (WebKit::NetworkResourceLoader::didRetrieveCacheEntry): 55 56 No need to synthesize fake willSendRequest anymore. 57 58 (WebKit::NetworkResourceLoader::validateCacheEntry): 59 (WebKit::NetworkResourceLoader::dispatchWillSendRequestForCacheEntry): 60 61 Route via web process willSendRequest so cached redirects looks exactly like network ones. 62 63 (WebKit::NetworkResourceLoader::messageSenderConnection): 64 * NetworkProcess/NetworkResourceLoader.h: 65 * NetworkProcess/cache/NetworkCache.cpp: 66 (WebKit::NetworkCache::makeUseDecision): 67 68 Ignore validation headers for cached redirects. 69 70 (WebKit::NetworkCache::makeRetrieveDecision): 71 (WebKit::NetworkCache::makeStoreDecision): 72 (WebKit::NetworkCache::Cache::retrieve): 73 (WebKit::NetworkCache::Cache::store): 74 75 Rename originalRequest -> request since it is not really the original request anymore in all cases. 76 77 (WebKit::NetworkCache::Cache::storeRedirect): 78 79 Stored redirects include the network layer generated ResourceRequest instead of body data. 80 81 (WebKit::NetworkCache::Cache::update): 82 * NetworkProcess/cache/NetworkCache.h: 83 * NetworkProcess/cache/NetworkCacheEntry.cpp: 84 (WebKit::NetworkCache::Entry::Entry): 85 86 New constructor for making redirect entries. 87 88 (WebKit::NetworkCache::Entry::encodeAsStorageRecord): 89 (WebKit::NetworkCache::Entry::decodeStorageRecord): 90 91 Encoding support. 92 93 * NetworkProcess/cache/NetworkCacheEntry.h: 94 (WebKit::NetworkCache::Entry::varyingRequestHeaders): 95 (WebKit::NetworkCache::Entry::redirectRequest): 96 * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp: 97 (WebKit::NetworkCache::SpeculativeLoad::~SpeculativeLoad): 98 (WebKit::NetworkCache::SpeculativeLoad::willSendRedirectedRequest): 99 * NetworkProcess/cache/NetworkCacheSpeculativeLoad.h: 100 * NetworkProcess/cache/NetworkCacheStatistics.cpp: 101 (WebKit::NetworkCache::cachedEntryReuseFailureToDiagnosticKey): 102 1 103 2015-12-18 Michael Catanzaro <mcatanzaro@igalia.com> 2 104 -
trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp
r194043 r194313 150 150 ASSERT(RunLoop::isMain()); 151 151 152 auto oldRequest = m_currentRequest; 152 153 m_currentRequest = request; 153 m_client.willSendRedirectedRequest( request, redirectResponse);154 m_client.willSendRedirectedRequest(oldRequest, request, redirectResponse); 154 155 } 155 156 -
trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h
r194043 r194313 54 54 void cancel(); 55 55 56 const WebCore::ResourceRequest& currentRequest() const { return m_currentRequest; } 56 57 void clearCurrentRequest() { m_currentRequest = WebCore::ResourceRequest(); } 57 58 -
trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h
r193787 r194313 51 51 virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) = 0; 52 52 virtual void canAuthenticateAgainstProtectionSpaceAsync(const WebCore::ProtectionSpace&) = 0; 53 virtual void willSendRedirectedRequest(const WebCore::ResourceRequest&, const WebCore::ResourceRe sponse& redirectResponse) = 0;53 virtual void willSendRedirectedRequest(const WebCore::ResourceRequest&, const WebCore::ResourceRequest& redirectRequest, const WebCore::ResourceResponse& redirectResponse) = 0; 54 54 enum class ShouldContinueDidReceiveResponse { No, Yes }; 55 55 virtual ShouldContinueDidReceiveResponse didReceiveResponse(const WebCore::ResourceResponse&) = 0; -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp
r193787 r194313 108 108 } 109 109 110 #if ENABLE(NETWORK_CACHE) 111 bool NetworkResourceLoader::canUseCache(const ResourceRequest& request) const 112 { 113 if (!NetworkCache::singleton().isEnabled()) 114 return false; 115 if (sessionID().isEphemeral()) 116 return false; 117 if (!request.url().protocolIsInHTTPFamily()) 118 return false; 119 return true; 120 } 121 #endif 122 110 123 bool NetworkResourceLoader::isSynchronous() const 111 124 { … … 121 134 122 135 #if ENABLE(NETWORK_CACHE) 123 if (!NetworkCache::singleton().isEnabled() || sessionID().isEphemeral() || !originalRequest().url().protocolIsInHTTPFamily()) { 124 startNetworkLoad(); 125 return; 126 } 136 if (canUseCache(originalRequest())) { 137 retrieveCacheEntry(originalRequest()); 138 return; 139 } 140 #endif 141 142 startNetworkLoad(originalRequest()); 143 } 144 145 #if ENABLE(NETWORK_CACHE) 146 void NetworkResourceLoader::retrieveCacheEntry(const ResourceRequest& request) 147 { 148 ASSERT(canUseCache(request)); 127 149 128 150 RefPtr<NetworkResourceLoader> loader(this); 129 NetworkCache::singleton().retrieve( originalRequest(), { m_parameters.webPageID, m_parameters.webFrameID }, [loader](std::unique_ptr<NetworkCache::Entry> entry) {151 NetworkCache::singleton().retrieve(request, { m_parameters.webPageID, m_parameters.webFrameID }, [loader, request](std::unique_ptr<NetworkCache::Entry> entry) { 130 152 if (loader->hasOneRef()) { 131 153 // The loader has been aborted and is only held alive by this lambda. … … 133 155 } 134 156 if (!entry) { 135 loader->startNetworkLoad( );157 loader->startNetworkLoad(request); 136 158 return; 137 159 } 160 if (entry->redirectRequest()) { 161 loader->dispatchWillSendRequestForCacheEntry(WTF::move(entry)); 162 return; 163 } 138 164 if (loader->m_parameters.needsCertificateInfo && !entry->response().containsCertificateInfo()) { 139 loader->startNetworkLoad( );165 loader->startNetworkLoad(request); 140 166 return; 141 167 } … … 146 172 loader->didRetrieveCacheEntry(WTF::move(entry)); 147 173 }); 148 #else 149 startNetworkLoad(); 150 #endif 151 } 152 153 void NetworkResourceLoader::startNetworkLoad(const Optional<ResourceRequest>& updatedRequest) 174 } 175 #endif 176 177 void NetworkResourceLoader::startNetworkLoad(const ResourceRequest& request) 154 178 { 155 179 consumeSandboxExtensions(); … … 159 183 160 184 #if ENABLE(NETWORK_CACHE) 161 if ( NetworkCache::singleton().isEnabled())185 if (canUseCache(request)) 162 186 m_bufferedDataForCache = SharedBuffer::create(); 163 187 #endif … … 165 189 NetworkLoadParameters parameters = m_parameters; 166 190 parameters.defersLoading = m_defersLoading; 167 if (updatedRequest) 168 parameters.request = updatedRequest.value(); 191 parameters.request = request; 169 192 m_networkLoad = std::make_unique<NetworkLoad>(*this, parameters); 170 193 } … … 213 236 214 237 if (m_networkLoad && !m_didConvertToDownload) { 215 m_networkLoad->cancel(); 216 217 #if ENABLE(NETWORK_CACHE) 218 if (NetworkCache::singleton().isEnabled()) { 238 #if ENABLE(NETWORK_CACHE) 239 if (canUseCache(m_networkLoad->currentRequest())) { 219 240 // We might already have used data from this incomplete load. Ensure older versions don't remain in the cache after cancel. 220 241 if (!m_response.isNull()) 221 NetworkCache::singleton().remove(originalRequest()); 222 } 223 #endif 242 NetworkCache::singleton().remove(m_networkLoad->currentRequest()); 243 } 244 #endif 245 m_networkLoad->cancel(); 224 246 } 225 247 … … 303 325 { 304 326 #if ENABLE(NETWORK_CACHE) 305 if ( NetworkCache::singleton().isEnabled()) {327 if (canUseCache(m_networkLoad->currentRequest())) { 306 328 if (m_cacheEntryForValidation) { 307 329 // 304 Not Modified … … 311 333 return; 312 334 } 313 bool allowStale = originalRequest().cachePolicy() >= ReturnCacheDataElseLoad;314 bool hasCacheableRedirect = m_response.isHTTP() && redirectChainAllowsReuse(m_redirectChainCacheStatus, allowStale ? ReuseExpiredRedirection : DoNotReuseExpiredRedirection);315 if (hasCacheableRedirect && m_redirectChainCacheStatus.status == RedirectChainCacheStatus::CachedRedirection) {316 // Maybe we should cache the actual redirects instead of the end result?317 auto now = std::chrono::system_clock::now();318 auto responseEndOfValidity = now + computeFreshnessLifetimeForHTTPFamily(m_response, now) - computeCurrentAge(m_response, now);319 hasCacheableRedirect = responseEndOfValidity <= m_redirectChainCacheStatus.endOfValidity;320 }321 335 322 336 bool isPrivateSession = sessionID().isEphemeral(); 323 if (m_bufferedDataForCache && hasCacheableRedirect&& !isPrivateSession) {337 if (m_bufferedDataForCache && m_response.isHTTP() && !isPrivateSession) { 324 338 // Keep the connection alive. 325 339 RefPtr<NetworkConnectionToWebProcess> connection(&connectionToWebProcess()); 326 340 RefPtr<NetworkResourceLoader> loader(this); 327 NetworkCache::singleton().store( originalRequest(), m_response, WTF::move(m_bufferedDataForCache), [loader, connection](NetworkCache::MappedBody& mappedBody) {341 NetworkCache::singleton().store(m_networkLoad->currentRequest(), m_response, WTF::move(m_bufferedDataForCache), [loader, connection](NetworkCache::MappedBody& mappedBody) { 328 342 #if ENABLE(SHAREABLE_RESOURCE) 329 343 if (mappedBody.shareableResourceHandle.isNull()) … … 333 347 #endif 334 348 }); 335 } else if (!hasCacheableRedirect) {336 // Make sure we don't keep a stale entry in the cache.337 NetworkCache::singleton().remove(originalRequest());338 349 } 339 350 } … … 372 383 } 373 384 374 void NetworkResourceLoader::willSendRedirectedRequest(const ResourceRequest& request, const ResourceResponse& redirectResponse) 375 { 376 #if ENABLE(NETWORK_CACHE) 377 updateRedirectChainStatus(m_redirectChainCacheStatus, redirectResponse); 378 #endif 379 385 void NetworkResourceLoader::willSendRedirectedRequest(const ResourceRequest& request, const WebCore::ResourceRequest& redirectRequest, const ResourceResponse& redirectResponse) 386 { 380 387 if (isSynchronous()) { 381 ResourceRequest overridenRequest = re quest;388 ResourceRequest overridenRequest = redirectRequest; 382 389 // FIXME: This needs to be fixed to follow the redirect correctly even for cross-domain requests. 383 390 // This includes at least updating host records, and comparing the current request instead of the original request here. 384 if (!protocolHostAndPortAreEqual(originalRequest().url(), re quest.url())) {391 if (!protocolHostAndPortAreEqual(originalRequest().url(), redirectRequest.url())) { 385 392 ASSERT(m_synchronousLoadData->error.isNull()); 386 393 m_synchronousLoadData->error = SynchronousLoaderClient::platformBadResponseError(); … … 391 398 return; 392 399 } 393 sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(request, redirectResponse)); 394 } 395 400 sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(redirectRequest, redirectResponse)); 401 402 #if ENABLE(NETWORK_CACHE) 403 if (canUseCache(request)) 404 NetworkCache::singleton().storeRedirect(request, redirectResponse, redirectRequest); 405 #else 406 UNUSED_PARAM(request); 407 #endif 408 } 409 396 410 void NetworkResourceLoader::continueWillSendRequest(const ResourceRequest& newRequest) 397 411 { 412 #if ENABLE(NETWORK_CACHE) 413 if (m_isWaitingContinueWillSendRequestForCachedRedirect) { 414 LOG(NetworkCache, "(NetworkProcess) Retrieving cached redirect"); 415 if (canUseCache(newRequest)) 416 retrieveCacheEntry(newRequest); 417 else 418 startNetworkLoad(newRequest); 419 420 m_isWaitingContinueWillSendRequestForCachedRedirect = false; 421 return; 422 } 423 #endif 398 424 m_networkLoad->continueWillSendRequest(newRequest); 399 425 } … … 464 490 sendReplyToSynchronousRequest(*m_synchronousLoadData, entry->buffer()); 465 491 } else { 466 if (entry->response().url() != originalRequest().url()) {467 // This is a cached redirect. Synthesize a minimal redirect so we get things like referer header right.468 // FIXME: We should cache the actual redirects.469 ResourceRequest syntheticRedirectRequest(entry->response().url());470 ResourceResponse syntheticRedirectResponse(originalRequest().url(), { }, 0, { });471 sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(syntheticRedirectRequest, syntheticRedirectResponse));472 }473 474 492 bool needsContinueDidReceiveResponseMessage = originalRequest().requester() == ResourceRequest::Requester::Main; 475 493 sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(entry->response(), needsContinueDidReceiveResponseMessage)); … … 512 530 startNetworkLoad(revalidationRequest); 513 531 } 532 533 void NetworkResourceLoader::dispatchWillSendRequestForCacheEntry(std::unique_ptr<NetworkCache::Entry> entry) 534 { 535 ASSERT(entry->redirectRequest()); 536 LOG(NetworkCache, "(NetworkProcess) Executing cached redirect"); 537 538 sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(*entry->redirectRequest(), entry->response())); 539 m_isWaitingContinueWillSendRequestForCachedRedirect = true; 540 } 514 541 #endif 515 542 -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
r193787 r194313 62 62 NetworkLoad* networkLoad() const { return m_networkLoad.get(); } 63 63 64 #if ENABLE(NETWORK_CACHE) 65 bool canUseCache(const WebCore::ResourceRequest&) const; 66 #endif 67 64 68 void start(); 65 69 void abort(); … … 98 102 virtual void canAuthenticateAgainstProtectionSpaceAsync(const WebCore::ProtectionSpace&) override; 99 103 virtual bool isSynchronous() const override; 100 virtual void willSendRedirectedRequest(const WebCore::ResourceRequest&, const WebCore::ResourceRe sponse& redirectResponse) override;104 virtual void willSendRedirectedRequest(const WebCore::ResourceRequest&, const WebCore::ResourceRequest& redirectRequest, const WebCore::ResourceResponse& redirectResponse) override; 101 105 virtual ShouldContinueDidReceiveResponse didReceiveResponse(const WebCore::ResourceResponse&) override; 102 106 virtual void didReceiveBuffer(RefPtr<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override; … … 113 117 114 118 #if ENABLE(NETWORK_CACHE) 119 void retrieveCacheEntry(const WebCore::ResourceRequest&); 115 120 void didRetrieveCacheEntry(std::unique_ptr<NetworkCache::Entry>); 116 121 void validateCacheEntry(std::unique_ptr<NetworkCache::Entry>); 122 void dispatchWillSendRequestForCacheEntry(std::unique_ptr<NetworkCache::Entry>); 117 123 #endif 118 124 119 void startNetworkLoad(const Optional<WebCore::ResourceRequest>& updatedRequest = { });125 void startNetworkLoad(const WebCore::ResourceRequest&); 120 126 void continueDidReceiveResponse(); 121 127 … … 156 162 RefPtr<WebCore::SharedBuffer> m_bufferedDataForCache; 157 163 std::unique_ptr<NetworkCache::Entry> m_cacheEntryForValidation; 158 159 WebCore::RedirectChainCacheStatus m_redirectChainCacheStatus; 164 bool m_isWaitingContinueWillSendRequestForCachedRedirect { false }; 160 165 #endif 161 166 }; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp
r193756 r194313 221 221 // The request is conditional so we force revalidation from the network. We merely check the disk cache 222 222 // so we can update the cache entry. 223 if (request.isConditional() )223 if (request.isConditional() && !entry.redirectRequest()) 224 224 return UseDecision::Validate; 225 225 … … 237 237 return UseDecision::NoDueToMissingValidatorFields; 238 238 239 return UseDecision::Validate;239 return entry.redirectRequest() ? UseDecision::NoDueToExpiredRedirect : UseDecision::Validate; 240 240 } 241 241 … … 344 344 } 345 345 346 void Cache::retrieve(const WebCore::ResourceRequest& originalRequest, const GlobalFrameID& frameID, std::function<void (std::unique_ptr<Entry>)> completionHandler)346 void Cache::retrieve(const WebCore::ResourceRequest& request, const GlobalFrameID& frameID, std::function<void (std::unique_ptr<Entry>)> completionHandler) 347 347 { 348 348 ASSERT(isEnabled()); 349 ASSERT( originalRequest.url().protocolIsInHTTPFamily());350 351 LOG(NetworkCache, "(NetworkProcess) retrieving %s priority %d", originalRequest.url().string().ascii().data(), static_cast<int>(originalRequest.priority()));349 ASSERT(request.url().protocolIsInHTTPFamily()); 350 351 LOG(NetworkCache, "(NetworkProcess) retrieving %s priority %d", request.url().string().ascii().data(), static_cast<int>(request.priority())); 352 352 353 353 if (m_statistics) 354 354 m_statistics->recordRetrievalRequest(frameID.first); 355 355 356 Key storageKey = makeCacheKey( originalRequest);356 Key storageKey = makeCacheKey(request); 357 357 358 358 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION) 359 359 if (m_speculativeLoadManager) 360 m_speculativeLoadManager->registerLoad(frameID, originalRequest, storageKey);361 #endif 362 363 auto retrieveDecision = makeRetrieveDecision( originalRequest);360 m_speculativeLoadManager->registerLoad(frameID, request, storageKey); 361 #endif 362 363 auto retrieveDecision = makeRetrieveDecision(request); 364 364 if (retrieveDecision != RetrieveDecision::Yes) { 365 365 if (m_statistics) 366 m_statistics->recordNotUsingCacheForRequest(frameID.first, storageKey, originalRequest, retrieveDecision);366 m_statistics->recordNotUsingCacheForRequest(frameID.first, storageKey, request, retrieveDecision); 367 367 368 368 completionHandler(nullptr); … … 371 371 372 372 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION) 373 if (m_speculativeLoadManager && m_speculativeLoadManager->retrieve(frameID, storageKey, [ originalRequest, completionHandler](std::unique_ptr<Entry> entry) {374 if (entry && verifyVaryingRequestHeaders(entry->varyingRequestHeaders(), originalRequest))373 if (m_speculativeLoadManager && m_speculativeLoadManager->retrieve(frameID, storageKey, [request, completionHandler](std::unique_ptr<Entry> entry) { 374 if (entry && verifyVaryingRequestHeaders(entry->varyingRequestHeaders(), request)) 375 375 completionHandler(WTF::move(entry)); 376 376 else … … 381 381 382 382 auto startTime = std::chrono::system_clock::now(); 383 auto priority = static_cast<unsigned>( originalRequest.priority());384 385 m_storage->retrieve(storageKey, priority, [this, originalRequest, completionHandler, startTime, storageKey, frameID](std::unique_ptr<Storage::Record> record) {383 auto priority = static_cast<unsigned>(request.priority()); 384 385 m_storage->retrieve(storageKey, priority, [this, request, completionHandler, startTime, storageKey, frameID](std::unique_ptr<Storage::Record> record) { 386 386 if (!record) { 387 387 LOG(NetworkCache, "(NetworkProcess) not found in storage"); 388 388 389 389 if (m_statistics) 390 m_statistics->recordRetrievalFailure(frameID.first, storageKey, originalRequest);390 m_statistics->recordRetrievalFailure(frameID.first, storageKey, request); 391 391 392 392 completionHandler(nullptr); … … 398 398 auto entry = Entry::decodeStorageRecord(*record); 399 399 400 auto useDecision = entry ? makeUseDecision(*entry, originalRequest) : UseDecision::NoDueToDecodeFailure;400 auto useDecision = entry ? makeUseDecision(*entry, request) : UseDecision::NoDueToDecodeFailure; 401 401 switch (useDecision) { 402 402 case UseDecision::Use: … … 411 411 #if !LOG_DISABLED 412 412 auto elapsedMS = static_cast<int64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - startTime).count()); 413 LOG(NetworkCache, "(NetworkProcess) retrieve complete useDecision=%d priority=%d time=%" PRIi64 "ms", static_cast<int>(useDecision), static_cast<int>( originalRequest.priority()), elapsedMS);413 LOG(NetworkCache, "(NetworkProcess) retrieve complete useDecision=%d priority=%d time=%" PRIi64 "ms", static_cast<int>(useDecision), static_cast<int>(request.priority()), elapsedMS); 414 414 #endif 415 415 completionHandler(WTF::move(entry)); 416 416 417 417 if (m_statistics) 418 m_statistics->recordRetrievedCachedEntry(frameID.first, storageKey, originalRequest, useDecision);418 m_statistics->recordRetrievedCachedEntry(frameID.first, storageKey, request, useDecision); 419 419 return useDecision != UseDecision::NoDueToDecodeFailure; 420 420 }); 421 421 } 422 422 423 std::unique_ptr<Entry> Cache::store(const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceResponse& response, RefPtr<WebCore::SharedBuffer>&& responseData, std::function<void (MappedBody&)> completionHandler)423 std::unique_ptr<Entry> Cache::store(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, RefPtr<WebCore::SharedBuffer>&& responseData, std::function<void (MappedBody&)> completionHandler) 424 424 { 425 425 ASSERT(isEnabled()); 426 426 ASSERT(responseData); 427 427 428 #if !LOG_DISABLED 429 #if ENABLE(CACHE_PARTITIONING) 430 CString partition = originalRequest.cachePartition().latin1(); 431 #else 432 CString partition = "No partition"; 433 #endif 434 LOG(NetworkCache, "(NetworkProcess) storing %s, partition %s", originalRequest.url().string().latin1().data(), partition.data()); 435 #endif // !LOG_DISABLED 436 437 StoreDecision storeDecision = makeStoreDecision(originalRequest, response); 428 LOG(NetworkCache, "(NetworkProcess) storing %s, partition %s", request.url().string().latin1().data(), makeCacheKey(request).partition().latin1().data()); 429 430 StoreDecision storeDecision = makeStoreDecision(request, response); 438 431 if (storeDecision != StoreDecision::Yes) { 439 432 LOG(NetworkCache, "(NetworkProcess) didn't store, storeDecision=%d", static_cast<int>(storeDecision)); 440 auto key = makeCacheKey( originalRequest);433 auto key = makeCacheKey(request); 441 434 442 435 auto isSuccessfulRevalidation = response.httpStatusCode() == 304; … … 452 445 } 453 446 454 std::unique_ptr<Entry> cacheEntry = std::make_unique<Entry>(makeCacheKey( originalRequest), response, WTF::move(responseData), collectVaryingRequestHeaders(originalRequest, response));447 std::unique_ptr<Entry> cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, WTF::move(responseData), collectVaryingRequestHeaders(request, response)); 455 448 456 449 auto record = cacheEntry->encodeAsStorageRecord(); … … 469 462 }); 470 463 464 return cacheEntry; 465 } 466 467 std::unique_ptr<Entry> Cache::storeRedirect(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, const WebCore::ResourceRequest& redirectRequest) 468 { 469 ASSERT(isEnabled()); 470 471 LOG(NetworkCache, "(NetworkProcess) storing redirect %s -> %s", request.url().string().latin1().data(), redirectRequest.url().string().latin1().data()); 472 473 StoreDecision storeDecision = makeStoreDecision(request, response); 474 if (storeDecision != StoreDecision::Yes) { 475 LOG(NetworkCache, "(NetworkProcess) didn't store redirect, storeDecision=%d", static_cast<int>(storeDecision)); 476 auto key = makeCacheKey(request); 477 if (m_statistics) 478 m_statistics->recordNotCachingResponse(key, storeDecision); 479 480 return nullptr; 481 } 482 483 std::unique_ptr<Entry> cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, collectVaryingRequestHeaders(request, response)); 484 485 auto record = cacheEntry->encodeAsStorageRecord(); 486 487 m_storage->store(record, nullptr); 488 471 489 return cacheEntry; 472 490 } -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h
r192328 r194313 83 83 NoDueToMissingValidatorFields, 84 84 NoDueToDecodeFailure, 85 NoDueToExpiredRedirect, 85 86 }; 86 87 … … 105 106 void retrieve(const WebCore::ResourceRequest&, const GlobalFrameID&, std::function<void (std::unique_ptr<Entry>)>); 106 107 std::unique_ptr<Entry> store(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&, std::function<void (MappedBody&)>); 108 std::unique_ptr<Entry> storeRedirect(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, const WebCore::ResourceRequest& redirectRequest); 107 109 std::unique_ptr<Entry> update(const WebCore::ResourceRequest&, const GlobalFrameID&, const Entry&, const WebCore::ResourceResponse& validatingResponse); 108 110 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEntry.cpp
r192328 r194313 50 50 } 51 51 52 Entry::Entry(const Key& key, const WebCore::ResourceResponse& response, const WebCore::ResourceRequest& redirectRequest, const Vector<std::pair<String, String>>& varyingRequestHeaders) 53 : m_key(key) 54 , m_timeStamp(std::chrono::system_clock::now()) 55 , m_response(response) 56 , m_varyingRequestHeaders(varyingRequestHeaders) 57 , m_redirectRequest(WebCore::ResourceRequest::adopt(redirectRequest.copyData())) // Don't include the underlying platform request object. 58 { 59 ASSERT(m_key.type() == "resource"); 60 // Redirect body is not needed even if exists. 61 m_redirectRequest->setHTTPBody(nullptr); 62 } 63 52 64 Entry::Entry(const Entry& other) 53 65 : m_key(other.m_key) … … 78 90 encoder << m_varyingRequestHeaders; 79 91 92 bool isRedirect = !!m_redirectRequest; 93 encoder << isRedirect; 94 if (isRedirect) 95 m_redirectRequest->encodeWithoutPlatformData(encoder); 96 80 97 encoder.encodeChecksum(); 81 98 … … 103 120 if (hasVaryingRequestHeaders) { 104 121 if (!decoder.decode(entry->m_varyingRequestHeaders)) 122 return nullptr; 123 } 124 125 bool isRedirect; 126 if (!decoder.decode(isRedirect)) 127 return nullptr; 128 129 if (isRedirect) { 130 entry->m_redirectRequest = std::make_unique<WebCore::ResourceRequest>(); 131 if (!entry->m_redirectRequest->decodeWithoutPlatformData(decoder)) 105 132 return nullptr; 106 133 } -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEntry.h
r192328 r194313 31 31 #include "NetworkCacheStorage.h" 32 32 #include "ShareableResource.h" 33 #include <WebCore/ResourceRequest.h> 33 34 #include <WebCore/ResourceResponse.h> 34 35 #include <wtf/Noncopyable.h> … … 36 37 37 38 namespace WebCore { 38 class ResourceRequest;39 39 class SharedBuffer; 40 40 } … … 47 47 public: 48 48 Entry(const Key&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&, const Vector<std::pair<String, String>>& varyingRequestHeaders); 49 Entry(const Key&, const WebCore::ResourceResponse&, const WebCore::ResourceRequest& redirectRequest, const Vector<std::pair<String, String>>& varyingRequestHeaders); 49 50 explicit Entry(const Storage::Record&); 50 51 Entry(const Entry&); … … 59 60 60 61 WebCore::SharedBuffer* buffer() const; 62 const WebCore::ResourceRequest* redirectRequest() const { return m_redirectRequest.get(); } 63 61 64 #if ENABLE(SHAREABLE_RESOURCE) 62 65 ShareableResource::Handle& shareableResourceHandle() const; … … 81 84 Vector<std::pair<String, String>> m_varyingRequestHeaders; 82 85 86 std::unique_ptr<WebCore::ResourceRequest> m_redirectRequest; 83 87 mutable RefPtr<WebCore::SharedBuffer> m_buffer; 84 88 #if ENABLE(SHAREABLE_RESOURCE) -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp
r192328 r194313 64 64 } 65 65 66 void SpeculativeLoad::willSendRedirectedRequest(const ResourceRequest& request, const ResourceRe sponse& redirectResponse)66 void SpeculativeLoad::willSendRedirectedRequest(const ResourceRequest& request, const ResourceRequest& redirectRequest, const ResourceResponse& redirectResponse) 67 67 { 68 68 updateRedirectChainStatus(m_redirectChainCacheStatus, redirectResponse); -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h
r193787 r194313 55 55 virtual void canAuthenticateAgainstProtectionSpaceAsync(const WebCore::ProtectionSpace&) override { } 56 56 virtual bool isSynchronous() const override { return false; } 57 virtual void willSendRedirectedRequest(const WebCore::ResourceRequest&, const WebCore::ResourceRe sponse& redirectResponse) override;57 virtual void willSendRedirectedRequest(const WebCore::ResourceRequest&, const WebCore::ResourceRequest& redirectRequest, const WebCore::ResourceResponse& redirectResponse) override; 58 58 virtual ShouldContinueDidReceiveResponse didReceiveResponse(const WebCore::ResourceResponse&) override; 59 59 virtual void didReceiveBuffer(RefPtr<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp
r191377 r194313 281 281 return WebCore::DiagnosticLoggingKeys::missingValidatorFieldsKey(); 282 282 case UseDecision::NoDueToDecodeFailure: 283 case UseDecision::NoDueToExpiredRedirect: 283 284 return WebCore::DiagnosticLoggingKeys::otherKey(); 284 285 case UseDecision::Use:
Note: See TracChangeset
for help on using the changeset viewer.