Title: [201805] trunk
Revision
201805
Author
an...@apple.com
Date
2016-06-08 06:37:04 -0700 (Wed, 08 Jun 2016)

Log Message

WebKit memory cache doesn't respect Vary header
https://bugs.webkit.org/show_bug.cgi?id=71509
<rdar://problem/26651033>

Reviewed by Sam Weinig.

Source/WebCore:

Implement Vary header support in WebCore memory cache.

The patch moves Vary header code from WebKit2 Network Cache to WebCore and uses it to
verify the headers for CachedResources.

* loader/cache/CachedResource.cpp:
(WebCore::CachedResource::failBeforeStarting):
(WebCore::addAdditionalRequestHeadersToRequest):

    Factor into standalone function so we can use it from varyHeaderValuesMatch.

(WebCore::CachedResource::addAdditionalRequestHeaders):
(WebCore::CachedResource::load):
(WebCore::CachedResource::setResponse):

    Collect the Vary header values when we receive a response.

(WebCore::CachedResource::responseReceived):
(WebCore::CachedResource::redirectChainAllowsReuse):
(WebCore::CachedResource::varyHeaderValuesMatch):

    Test for Vary match.

(WebCore::CachedResource::overheadSize):
* loader/cache/CachedResource.h:
(WebCore::CachedResource::isCacheValidator):
(WebCore::CachedResource::resourceToRevalidate):
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::determineRevalidationPolicy):

    Reload on Vary mismatch.

* platform/network/CacheValidation.cpp:
(WebCore::parseCacheControlDirectives):
(WebCore::headerValueForVary):
(WebCore::collectVaryingRequestHeaders):
(WebCore::verifyVaryingRequestHeaders):

    Vary header collection and validation code moves here.

* platform/network/CacheValidation.h:

Source/WebKit2:

* NetworkProcess/cache/NetworkCache.cpp:
(WebKit::NetworkCache::makeCacheKey):
(WebKit::NetworkCache::cachePolicyAllowsExpired):
(WebKit::NetworkCache::makeUseDecision):
(WebKit::NetworkCache::Cache::retrieve):
(WebKit::NetworkCache::Cache::store):
(WebKit::NetworkCache::Cache::storeRedirect):
(WebKit::NetworkCache::Cache::update):
(WebKit::NetworkCache::headerValueForVary): Deleted.
(WebKit::NetworkCache::collectVaryingRequestHeaders): Deleted.
(WebKit::NetworkCache::verifyVaryingRequestHeaders): Deleted.

    These move to WebCore.

LayoutTests:

* http/tests/cache/disk-cache/disk-cache-vary-expected.txt:
* http/tests/cache/disk-cache/disk-cache-vary-no-body-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (201804 => 201805)


--- trunk/LayoutTests/ChangeLog	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/LayoutTests/ChangeLog	2016-06-08 13:37:04 UTC (rev 201805)
@@ -1,3 +1,14 @@
+2016-06-06  Antti Koivisto  <an...@apple.com>
+
+        WebKit memory cache doesn't respect Vary header
+        https://bugs.webkit.org/show_bug.cgi?id=71509
+        <rdar://problem/26651033>
+
+        Reviewed by Sam Weinig.
+
+        * http/tests/cache/disk-cache/disk-cache-vary-expected.txt:
+        * http/tests/cache/disk-cache/disk-cache-vary-no-body-expected.txt:
+
 2016-06-08  Adam Bergkvist  <adam.bergkv...@ericsson.com>
 
         WebRTC: Imlement MediaEndpointPeerConnection::setLocalDescription()

Modified: trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-expected.txt (201804 => 201805)


--- trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-expected.txt	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-expected.txt	2016-06-08 13:37:04 UTC (rev 201805)
@@ -558,7 +558,7 @@
 
 response headers: {"Cache-control":"max-age=100","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache
+response source: Network
 
 response headers: {"Cache-control":"no-store","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
@@ -586,15 +586,15 @@
 
 response headers: {"ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=0","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=100","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache
+response source: Network
 
 response headers: {"Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
@@ -610,15 +610,15 @@
 
 response headers: {"Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=0, no-cache","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=100, no-cache","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"ETag":"nomatch","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
@@ -630,7 +630,7 @@
 
 response headers: {"Cache-control":"max-age=100","ETag":"nomatch","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache
+response source: Network
 
 response headers: {"Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}

Modified: trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-no-body-expected.txt (201804 => 201805)


--- trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-no-body-expected.txt	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-no-body-expected.txt	2016-06-08 13:37:04 UTC (rev 201805)
@@ -558,7 +558,7 @@
 
 response headers: {"Cache-control":"max-age=100","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache
+response source: Network
 
 response headers: {"Cache-control":"no-store","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
@@ -586,15 +586,15 @@
 
 response headers: {"ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=0","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=100","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache
+response source: Network
 
 response headers: {"Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
@@ -610,15 +610,15 @@
 
 response headers: {"Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=0, no-cache","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"Cache-control":"max-age=100, no-cache","ETag":"match","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache after validation
+response source: Network
 
 response headers: {"ETag":"nomatch","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
@@ -630,7 +630,7 @@
 
 response headers: {"Cache-control":"max-age=100","ETag":"nomatch","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}
-response source: Memory cache
+response source: Network
 
 response headers: {"Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
 request headers: {"Accept-Language":"unique()"}

Modified: trunk/Source/WebCore/ChangeLog (201804 => 201805)


--- trunk/Source/WebCore/ChangeLog	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebCore/ChangeLog	2016-06-08 13:37:04 UTC (rev 201805)
@@ -1,3 +1,53 @@
+2016-06-08  Antti Koivisto  <an...@apple.com>
+
+        WebKit memory cache doesn't respect Vary header
+        https://bugs.webkit.org/show_bug.cgi?id=71509
+        <rdar://problem/26651033>
+
+        Reviewed by Sam Weinig.
+
+        Implement Vary header support in WebCore memory cache.
+
+        The patch moves Vary header code from WebKit2 Network Cache to WebCore and uses it to
+        verify the headers for CachedResources.
+
+        * loader/cache/CachedResource.cpp:
+        (WebCore::CachedResource::failBeforeStarting):
+        (WebCore::addAdditionalRequestHeadersToRequest):
+
+            Factor into standalone function so we can use it from varyHeaderValuesMatch.
+
+        (WebCore::CachedResource::addAdditionalRequestHeaders):
+        (WebCore::CachedResource::load):
+        (WebCore::CachedResource::setResponse):
+
+            Collect the Vary header values when we receive a response.
+
+        (WebCore::CachedResource::responseReceived):
+        (WebCore::CachedResource::redirectChainAllowsReuse):
+        (WebCore::CachedResource::varyHeaderValuesMatch):
+
+            Test for Vary match.
+
+        (WebCore::CachedResource::overheadSize):
+        * loader/cache/CachedResource.h:
+        (WebCore::CachedResource::isCacheValidator):
+        (WebCore::CachedResource::resourceToRevalidate):
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::determineRevalidationPolicy):
+
+            Reload on Vary mismatch.
+
+        * platform/network/CacheValidation.cpp:
+        (WebCore::parseCacheControlDirectives):
+        (WebCore::headerValueForVary):
+        (WebCore::collectVaryingRequestHeaders):
+        (WebCore::verifyVaryingRequestHeaders):
+
+            Vary header collection and validation code moves here.
+
+        * platform/network/CacheValidation.h:
+
 2016-06-08  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, rolling out r201800.

Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (201804 => 201805)


--- trunk/Source/WebCore/loader/cache/CachedResource.cpp	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp	2016-06-08 13:37:04 UTC (rev 201805)
@@ -182,7 +182,7 @@
     error(CachedResource::LoadError);
 }
 
-void CachedResource::addAdditionalRequestHeaders(CachedResourceLoader& cachedResourceLoader)
+static void addAdditionalRequestHeadersToRequest(ResourceRequest& request, const CachedResourceLoader& cachedResourceLoader)
 {
     // Note: We skip the Content-Security-Policy check here because we check
     // the Content-Security-Policy at the CachedResourceLoader layer so we can
@@ -191,24 +191,30 @@
     FrameLoader& frameLoader = cachedResourceLoader.frame()->loader();
     String outgoingReferrer;
     String outgoingOrigin;
-    if (m_resourceRequest.httpReferrer().isNull()) {
+    if (request.httpReferrer().isNull()) {
         outgoingReferrer = frameLoader.outgoingReferrer();
         outgoingOrigin = frameLoader.outgoingOrigin();
     } else {
-        outgoingReferrer = m_resourceRequest.httpReferrer();
+        outgoingReferrer = request.httpReferrer();
         outgoingOrigin = SecurityOrigin::createFromString(outgoingReferrer)->toString();
     }
 
-    outgoingReferrer = SecurityPolicy::generateReferrerHeader(cachedResourceLoader.document()->referrerPolicy(), m_resourceRequest.url(), outgoingReferrer);
+    auto referrerPolicy = cachedResourceLoader.document() ? cachedResourceLoader.document()->referrerPolicy() : ReferrerPolicy::Default;
+    outgoingReferrer = SecurityPolicy::generateReferrerHeader(referrerPolicy, request.url(), outgoingReferrer);
     if (outgoingReferrer.isEmpty())
-        m_resourceRequest.clearHTTPReferrer();
+        request.clearHTTPReferrer();
     else
-        m_resourceRequest.setHTTPReferrer(outgoingReferrer);
-    FrameLoader::addHTTPOriginIfNeeded(m_resourceRequest, outgoingOrigin);
+        request.setHTTPReferrer(outgoingReferrer);
+    FrameLoader::addHTTPOriginIfNeeded(request, outgoingOrigin);
 
-    frameLoader.addExtraFieldsToSubresourceRequest(m_resourceRequest);
+    frameLoader.addExtraFieldsToSubresourceRequest(request);
 }
 
+void CachedResource::addAdditionalRequestHeaders(CachedResourceLoader& cachedResourceLoader)
+{
+    addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader);
+}
+
 void CachedResource::load(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options)
 {
     if (!cachedResourceLoader.frame()) {
@@ -417,6 +423,8 @@
     m_response = response;
     m_response.setType(m_responseType);
     m_response.setRedirected(m_redirectChainCacheStatus.status != RedirectChainCacheStatus::NoRedirection);
+
+    m_varyingHeaderValues = collectVaryingRequestHeaders(m_resourceRequest, m_response, m_sessionID);
 }
 
 void CachedResource::responseReceived(const ResourceResponse& response)
@@ -765,6 +773,17 @@
     return WebCore::redirectChainAllowsReuse(m_redirectChainCacheStatus, reuseExpiredRedirection);
 }
 
+bool CachedResource::varyHeaderValuesMatch(const ResourceRequest& request, const CachedResourceLoader& cachedResourceLoader)
+{
+    if (m_varyingHeaderValues.isEmpty())
+        return true;
+
+    ResourceRequest requestWithFullHeaders(request);
+    addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader);
+
+    return verifyVaryingRequestHeaders(m_varyingHeaderValues, requestWithFullHeaders, m_sessionID);
+}
+
 unsigned CachedResource::overheadSize() const
 {
     static const int kAverageClientsHashMapSize = 384;

Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (201804 => 201805)


--- trunk/Source/WebCore/loader/cache/CachedResource.h	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h	2016-06-08 13:37:04 UTC (rev 201805)
@@ -242,6 +242,8 @@
     virtual RevalidationDecision makeRevalidationDecision(CachePolicy) const;
     bool redirectChainAllowsReuse(ReuseExpiredRedirectionOrNot) const;
 
+    bool varyHeaderValuesMatch(const ResourceRequest&, const CachedResourceLoader&);
+
     bool isCacheValidator() const { return m_resourceToRevalidate; }
     CachedResource* resourceToRevalidate() const { return m_resourceToRevalidate; }
     
@@ -354,6 +356,8 @@
 
     RedirectChainCacheStatus m_redirectChainCacheStatus;
 
+    Vector<std::pair<String, String>> m_varyingHeaderValues;
+
     unsigned long m_identifierForLoadWithoutResourceLoader { 0 };
 };
 

Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (201804 => 201805)


--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2016-06-08 13:37:04 UTC (rev 201805)
@@ -753,6 +753,9 @@
         return Reload;
     }
 
+    if (!existingResource->varyHeaderValuesMatch(request, *this))
+        return Reload;
+
     auto* textDecoder = existingResource->textResourceDecoder();
     if (textDecoder && !textDecoder->hasEqualEncodingForCharset(cachedResourceRequest.charset()))
         return Reload;

Modified: trunk/Source/WebCore/platform/network/CacheValidation.cpp (201804 => 201805)


--- trunk/Source/WebCore/platform/network/CacheValidation.cpp	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebCore/platform/network/CacheValidation.cpp	2016-06-08 13:37:04 UTC (rev 201805)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,7 +26,12 @@
 #include "config.h"
 #include "CacheValidation.h"
 
+#include "CookiesStrategy.h"
 #include "HTTPHeaderMap.h"
+#include "NetworkStorageSession.h"
+#include "PlatformCookieJar.h"
+#include "PlatformStrategies.h"
+#include "ResourceRequest.h"
 #include "ResourceResponse.h"
 #include <wtf/CurrentTime.h>
 
@@ -326,4 +331,58 @@
     return result;
 }
 
+static String headerValueForVary(const ResourceRequest& request, const String& headerName, SessionID sessionID)
+{
+    // Explicit handling for cookies is needed because they are added magically by the networking layer.
+    // FIXME: The value might have changed between making the request and retrieving the cookie here.
+    // We could fetch the cookie when making the request but that seems overkill as the case is very rare and it
+    // is a blocking operation. This should be sufficient to cover reasonable cases.
+    if (headerName == httpHeaderNameString(HTTPHeaderName::Cookie)) {
+        if (sessionID != SessionID::defaultSessionID()) {
+            // FIXME: Don't know how to get the cookie. There should be a global way to get NetworkStorageSession from sessionID.
+            return "";
+        }
+        auto& session = NetworkStorageSession::defaultStorageSession();
+        auto* cookieStrategy = platformStrategies() ? platformStrategies()->cookiesStrategy() : nullptr;
+        if (!cookieStrategy)
+            return cookieRequestHeaderFieldValue(session, request.firstPartyForCookies(), request.url());
+        return cookieStrategy->cookieRequestHeaderFieldValue(session, request.firstPartyForCookies(), request.url());
+    }
+    return request.httpHeaderField(headerName);
 }
+
+Vector<std::pair<String, String>> collectVaryingRequestHeaders(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, SessionID sessionID)
+{
+    String varyValue = response.httpHeaderField(WebCore::HTTPHeaderName::Vary);
+    if (varyValue.isEmpty())
+        return { };
+    Vector<String> varyingHeaderNames;
+    varyValue.split(',', /*allowEmptyEntries*/ false, varyingHeaderNames);
+    Vector<std::pair<String, String>> varyingRequestHeaders;
+    varyingRequestHeaders.reserveCapacity(varyingHeaderNames.size());
+    for (auto& varyHeaderName : varyingHeaderNames) {
+        String headerName = varyHeaderName.stripWhiteSpace();
+        String headerValue = headerValueForVary(request, headerName, sessionID);
+        varyingRequestHeaders.append(std::make_pair(headerName, headerValue));
+    }
+    return varyingRequestHeaders;
+}
+
+bool verifyVaryingRequestHeaders(const Vector<std::pair<String, String>>& varyingRequestHeaders, const WebCore::ResourceRequest& request, SessionID sessionID)
+{
+    for (auto& varyingRequestHeader : varyingRequestHeaders) {
+        // FIXME: Vary: * in response would ideally trigger a cache delete instead of a store.
+        if (varyingRequestHeader.first == "*")
+            return false;
+        if (sessionID != SessionID::defaultSessionID() && varyingRequestHeader.first == httpHeaderNameString(HTTPHeaderName::Cookie)) {
+            // FIXME: See the comment in headerValueForVary.
+            return false;
+        }
+        String headerValue = headerValueForVary(request, varyingRequestHeader.first, sessionID);
+        if (headerValue != varyingRequestHeader.second)
+            return false;
+    }
+    return true;
+}
+
+}

Modified: trunk/Source/WebCore/platform/network/CacheValidation.h (201804 => 201805)


--- trunk/Source/WebCore/platform/network/CacheValidation.h	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebCore/platform/network/CacheValidation.h	2016-06-08 13:37:04 UTC (rev 201805)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -27,11 +27,15 @@
 #define CacheValidation_h
 
 #include "PlatformExportMacros.h"
+#include "SessionID.h"
 #include <wtf/Optional.h>
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
 class HTTPHeaderMap;
+class ResourceRequest;
 class ResourceResponse;
 
 struct RedirectChainCacheStatus {
@@ -65,6 +69,9 @@
 };
 WEBCORE_EXPORT CacheControlDirectives parseCacheControlDirectives(const HTTPHeaderMap&);
 
+WEBCORE_EXPORT Vector<std::pair<String, String>> collectVaryingRequestHeaders(const ResourceRequest&, const ResourceResponse&, SessionID = SessionID::defaultSessionID());
+WEBCORE_EXPORT bool verifyVaryingRequestHeaders(const Vector<std::pair<String, String>>& varyingRequestHeaders, const ResourceRequest&, SessionID = SessionID::defaultSessionID());
+
 }
 
 #endif

Modified: trunk/Source/WebKit2/ChangeLog (201804 => 201805)


--- trunk/Source/WebKit2/ChangeLog	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebKit2/ChangeLog	2016-06-08 13:37:04 UTC (rev 201805)
@@ -1,3 +1,25 @@
+2016-06-06  Antti Koivisto  <an...@apple.com>
+
+        WebKit memory cache doesn't respect Vary header
+        https://bugs.webkit.org/show_bug.cgi?id=71509
+        <rdar://problem/26651033>
+
+        Reviewed by Sam Weinig.
+
+        * NetworkProcess/cache/NetworkCache.cpp:
+        (WebKit::NetworkCache::makeCacheKey):
+        (WebKit::NetworkCache::cachePolicyAllowsExpired):
+        (WebKit::NetworkCache::makeUseDecision):
+        (WebKit::NetworkCache::Cache::retrieve):
+        (WebKit::NetworkCache::Cache::store):
+        (WebKit::NetworkCache::Cache::storeRedirect):
+        (WebKit::NetworkCache::Cache::update):
+        (WebKit::NetworkCache::headerValueForVary): Deleted.
+        (WebKit::NetworkCache::collectVaryingRequestHeaders): Deleted.
+        (WebKit::NetworkCache::verifyVaryingRequestHeaders): Deleted.
+
+            These move to WebCore.
+
 2016-06-08  Carlos Garcia Campos  <cgar...@igalia.com>
 
         Unreviewed. Fix GTK+ build with threaded compositor enabled after r201802.

Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (201804 => 201805)


--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp	2016-06-08 12:56:36 UTC (rev 201804)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp	2016-06-08 13:37:04 UTC (rev 201805)
@@ -128,47 +128,6 @@
     return { partition, resourceType(), range, request.url().string() };
 }
 
-static String headerValueForVary(const WebCore::ResourceRequest& request, const String& headerName)
-{
-    // Explicit handling for cookies is needed because they are added magically by the networking layer.
-    // FIXME: The value might have changed between making the request and retrieving the cookie here.
-    // We could fetch the cookie when making the request but that seems overkill as the case is very rare and it
-    // is a blocking operation. This should be sufficient to cover reasonable cases.
-    if (headerName == httpHeaderNameString(WebCore::HTTPHeaderName::Cookie))
-        return WebCore::cookieRequestHeaderFieldValue(WebCore::NetworkStorageSession::defaultStorageSession(), request.firstPartyForCookies(), request.url());
-    return request.httpHeaderField(headerName);
-}
-
-static Vector<std::pair<String, String>> collectVaryingRequestHeaders(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response)
-{
-    String varyValue = response.httpHeaderField(WebCore::HTTPHeaderName::Vary);
-    if (varyValue.isEmpty())
-        return { };
-    Vector<String> varyingHeaderNames;
-    varyValue.split(',', /*allowEmptyEntries*/ false, varyingHeaderNames);
-    Vector<std::pair<String, String>> varyingRequestHeaders;
-    varyingRequestHeaders.reserveCapacity(varyingHeaderNames.size());
-    for (auto& varyHeaderName : varyingHeaderNames) {
-        String headerName = varyHeaderName.stripWhiteSpace();
-        String headerValue = headerValueForVary(request, headerName);
-        varyingRequestHeaders.append(std::make_pair(headerName, headerValue));
-    }
-    return varyingRequestHeaders;
-}
-
-static bool verifyVaryingRequestHeaders(const Vector<std::pair<String, String>>& varyingRequestHeaders, const WebCore::ResourceRequest& request)
-{
-    for (auto& varyingRequestHeader : varyingRequestHeaders) {
-        // FIXME: Vary: * in response would ideally trigger a cache delete instead of a store.
-        if (varyingRequestHeader.first == "*")
-            return false;
-        String headerValue = headerValueForVary(request, varyingRequestHeader.first);
-        if (headerValue != varyingRequestHeader.second)
-            return false;
-    }
-    return true;
-}
-
 static bool cachePolicyAllowsExpired(WebCore::ResourceRequestCachePolicy policy)
 {
     switch (policy) {
@@ -221,7 +180,7 @@
     if (request.isConditional() && !entry.redirectRequest())
         return UseDecision::Validate;
 
-    if (!verifyVaryingRequestHeaders(entry.varyingRequestHeaders(), request))
+    if (!WebCore::verifyVaryingRequestHeaders(entry.varyingRequestHeaders(), request))
         return UseDecision::NoDueToVaryingHeaderMismatch;
 
     // We never revalidate in the case of a history navigation.
@@ -374,7 +333,7 @@
 
 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
     if (canUseSpeculativeRevalidation && m_speculativeLoadManager->retrieve(frameID, storageKey, request, [request, completionHandler](std::unique_ptr<Entry> entry) {
-        if (entry && verifyVaryingRequestHeaders(entry->varyingRequestHeaders(), request))
+        if (entry && WebCore::verifyVaryingRequestHeaders(entry->varyingRequestHeaders(), request))
             completionHandler(WTFMove(entry));
         else
             completionHandler(nullptr);
@@ -447,7 +406,7 @@
         return nullptr;
     }
 
-    auto cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, WTFMove(responseData), collectVaryingRequestHeaders(request, response));
+    auto cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, WTFMove(responseData), WebCore::collectVaryingRequestHeaders(request, response));
     auto record = cacheEntry->encodeAsStorageRecord();
 
     m_storage->store(record, [completionHandler = WTFMove(completionHandler)](const Data& bodyData) {
@@ -482,7 +441,7 @@
         return nullptr;
     }
 
-    std::unique_ptr<Entry> cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, collectVaryingRequestHeaders(request, response));
+    std::unique_ptr<Entry> cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, WebCore::collectVaryingRequestHeaders(request, response));
 
     auto record = cacheEntry->encodeAsStorageRecord();
 
@@ -498,7 +457,7 @@
     WebCore::ResourceResponse response = existingEntry.response();
     WebCore::updateResponseHeadersAfterRevalidation(response, validatingResponse);
 
-    auto updateEntry = std::make_unique<Entry>(existingEntry.key(), response, existingEntry.buffer(), collectVaryingRequestHeaders(originalRequest, response));
+    auto updateEntry = std::make_unique<Entry>(existingEntry.key(), response, existingEntry.buffer(), WebCore::collectVaryingRequestHeaders(originalRequest, response));
     auto updateRecord = updateEntry->encodeAsStorageRecord();
 
     m_storage->store(updateRecord, { });
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to