Speculative revalidated request returns 200 instead of 304
https://bugs.webkit.org/show_bug.cgi?id=158256
Reviewed by Antti Koivisto and Carlos Garcia Campos.
Already conditional requests coming from WebCore should bypass the
SpeculativeLoadManager. This is because the validation is requested
by WebCore (usually the memory cache) and not our network cache. As
a result, we need to pipe the revalidation response (e.g. 304 status
code) back to WebCore instead of resolving it as disk cache level.
This should fix the /webkit2/WebKitWebResource/response unit test.
* NetworkProcess/cache/NetworkCache.cpp:
(WebKit::NetworkCache::Cache::retrieve):
* NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
(WebKit::NetworkCache::requestsHeadersMatch):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@201600 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp b/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp
index dc0f1a0..16d8555 100644
--- a/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp
+++ b/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp
@@ -269,28 +269,16 @@
#endif
-static bool requestsHeadersMatch(const ResourceRequest& a, const ResourceRequest& b)
+static bool requestsHeadersMatch(const ResourceRequest& speculativeValidationRequest, const ResourceRequest& actualRequest)
{
- static const HTTPHeaderName headersAllowedToMismatch[] = {
- HTTPHeaderName::IfMatch,
- HTTPHeaderName::IfModifiedSince,
- HTTPHeaderName::IfNoneMatch,
- HTTPHeaderName::IfRange,
- HTTPHeaderName::IfUnmodifiedSince,
- HTTPHeaderName::CacheControl
- };
+ ASSERT(!actualRequest.isConditional());
+ ResourceRequest speculativeRequest = speculativeValidationRequest;
+ speculativeRequest.makeUnconditional();
- HTTPHeaderMap headersA = a.httpHeaderFields();
- HTTPHeaderMap headersB = b.httpHeaderFields();
- for (auto headerName : headersAllowedToMismatch) {
- headersA.remove(headerName);
- headersB.remove(headerName);
- }
-
- if (headersA != headersB) {
+ if (speculativeRequest.httpHeaderFields() != actualRequest.httpHeaderFields()) {
LOG(NetworkCacheSpeculativePreloading, "Cannot reuse speculatively validated entry because HTTP headers used for validation do not match");
#if !LOG_DISABLED
- dumpHTTPHeadersDiff(headersA, headersB);
+ dumpHTTPHeadersDiff(speculativeRequest.httpHeaderFields(), actualRequest.httpHeaderFields());
#endif
return false;
}