⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 201600 in webkit


Ignore:
Timestamp:
Jun 2, 2016, 9:40:05 AM (10 years ago)
Author:
Chris Dumez
Message:

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):

Location:
trunk/Source/WebKit2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r201596 r201600  
     12016-06-02  Chris Dumez  <cdumez@apple.com>
     2
     3        Speculative revalidated request returns 200 instead of 304
     4        https://bugs.webkit.org/show_bug.cgi?id=158256
     5
     6        Reviewed by Antti Koivisto and Carlos Garcia Campos.
     7
     8        Already conditional requests coming from WebCore should bypass the
     9        SpeculativeLoadManager. This is because the validation is requested
     10        by WebCore (usually the memory cache) and not our network cache. As
     11        a result, we need to pipe the revalidation response (e.g. 304 status
     12        code) back to WebCore instead of resolving it as disk cache level.
     13
     14        This should fix the /webkit2/WebKitWebResource/response unit test.
     15
     16        * NetworkProcess/cache/NetworkCache.cpp:
     17        (WebKit::NetworkCache::Cache::retrieve):
     18        * NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
     19        (WebKit::NetworkCache::requestsHeadersMatch):
     20
    1212016-06-02  Youenn Fablet  <youenn.fablet@crf.canon.fr>
    222
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp

    r201587 r201600  
    359359
    360360#if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
    361     if (m_speculativeLoadManager)
     361    bool canUseSpeculativeRevalidation = m_speculativeLoadManager && !request.isConditional();
     362    if (canUseSpeculativeRevalidation)
    362363        m_speculativeLoadManager->registerLoad(frameID, request, storageKey);
    363364#endif
     
    373374
    374375#if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
    375     if (m_speculativeLoadManager && m_speculativeLoadManager->retrieve(frameID, storageKey, request, [request, completionHandler](std::unique_ptr<Entry> entry) {
     376    if (canUseSpeculativeRevalidation && m_speculativeLoadManager->retrieve(frameID, storageKey, request, [request, completionHandler](std::unique_ptr<Entry> entry) {
    376377        if (entry && verifyVaryingRequestHeaders(entry->varyingRequestHeaders(), request))
    377378            completionHandler(WTFMove(entry));
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp

    r201395 r201600  
    270270#endif
    271271
    272 static bool requestsHeadersMatch(const ResourceRequest& a, const ResourceRequest& b)
    273 {
    274     static const HTTPHeaderName headersAllowedToMismatch[] = {
    275         HTTPHeaderName::IfMatch,
    276         HTTPHeaderName::IfModifiedSince,
    277         HTTPHeaderName::IfNoneMatch,
    278         HTTPHeaderName::IfRange,
    279         HTTPHeaderName::IfUnmodifiedSince,
    280         HTTPHeaderName::CacheControl
    281     };
    282 
    283     HTTPHeaderMap headersA = a.httpHeaderFields();
    284     HTTPHeaderMap headersB = b.httpHeaderFields();
    285     for (auto headerName : headersAllowedToMismatch) {
    286         headersA.remove(headerName);
    287         headersB.remove(headerName);
    288     }
    289 
    290     if (headersA != headersB) {
     272static bool requestsHeadersMatch(const ResourceRequest& speculativeValidationRequest, const ResourceRequest& actualRequest)
     273{
     274    ASSERT(!actualRequest.isConditional());
     275    ResourceRequest speculativeRequest = speculativeValidationRequest;
     276    speculativeRequest.makeUnconditional();
     277
     278    if (speculativeRequest.httpHeaderFields() != actualRequest.httpHeaderFields()) {
    291279        LOG(NetworkCacheSpeculativePreloading, "Cannot reuse speculatively validated entry because HTTP headers used for validation do not match");
    292280#if !LOG_DISABLED
    293         dumpHTTPHeadersDiff(headersA, headersB);
     281        dumpHTTPHeadersDiff(speculativeRequest.httpHeaderFields(), actualRequest.httpHeaderFields());
    294282#endif
    295283        return false;
Note: See TracChangeset for help on using the changeset viewer.