<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[201600] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/201600">201600</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-06-02 09:40:05 -0700 (Thu, 02 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>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):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheSpeculativeLoadManagercpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (201599 => 201600)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-06-02 12:03:37 UTC (rev 201599)
+++ trunk/Source/WebKit2/ChangeLog        2016-06-02 16:40:05 UTC (rev 201600)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-06-02  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        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):
+
</ins><span class="cx"> 2016-06-02  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
</span><span class="cx"> 
</span><span class="cx">         Use more references in ResourceLoader related code
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (201599 => 201600)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2016-06-02 12:03:37 UTC (rev 201599)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2016-06-02 16:40:05 UTC (rev 201600)
</span><span class="lines">@@ -358,7 +358,8 @@
</span><span class="cx">     Key storageKey = makeCacheKey(request);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
</span><del>-    if (m_speculativeLoadManager)
</del><ins>+    bool canUseSpeculativeRevalidation = m_speculativeLoadManager &amp;&amp; !request.isConditional();
+    if (canUseSpeculativeRevalidation)
</ins><span class="cx">         m_speculativeLoadManager-&gt;registerLoad(frameID, request, storageKey);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -372,7 +373,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
</span><del>-    if (m_speculativeLoadManager &amp;&amp; m_speculativeLoadManager-&gt;retrieve(frameID, storageKey, request, [request, completionHandler](std::unique_ptr&lt;Entry&gt; entry) {
</del><ins>+    if (canUseSpeculativeRevalidation &amp;&amp; m_speculativeLoadManager-&gt;retrieve(frameID, storageKey, request, [request, completionHandler](std::unique_ptr&lt;Entry&gt; entry) {
</ins><span class="cx">         if (entry &amp;&amp; verifyVaryingRequestHeaders(entry-&gt;varyingRequestHeaders(), request))
</span><span class="cx">             completionHandler(WTFMove(entry));
</span><span class="cx">         else
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheSpeculativeLoadManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp (201599 => 201600)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp        2016-06-02 12:03:37 UTC (rev 201599)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp        2016-06-02 16:40:05 UTC (rev 201600)
</span><span class="lines">@@ -269,28 +269,16 @@
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-static bool requestsHeadersMatch(const ResourceRequest&amp; a, const ResourceRequest&amp; b)
</del><ins>+static bool requestsHeadersMatch(const ResourceRequest&amp; speculativeValidationRequest, const ResourceRequest&amp; actualRequest)
</ins><span class="cx"> {
</span><del>-    static const HTTPHeaderName headersAllowedToMismatch[] = {
-        HTTPHeaderName::IfMatch,
-        HTTPHeaderName::IfModifiedSince,
-        HTTPHeaderName::IfNoneMatch,
-        HTTPHeaderName::IfRange,
-        HTTPHeaderName::IfUnmodifiedSince,
-        HTTPHeaderName::CacheControl
-    };
</del><ins>+    ASSERT(!actualRequest.isConditional());
+    ResourceRequest speculativeRequest = speculativeValidationRequest;
+    speculativeRequest.makeUnconditional();
</ins><span class="cx"> 
</span><del>-    HTTPHeaderMap headersA = a.httpHeaderFields();
-    HTTPHeaderMap headersB = b.httpHeaderFields();
-    for (auto headerName : headersAllowedToMismatch) {
-        headersA.remove(headerName);
-        headersB.remove(headerName);
-    }
-
-    if (headersA != headersB) {
</del><ins>+    if (speculativeRequest.httpHeaderFields() != actualRequest.httpHeaderFields()) {
</ins><span class="cx">         LOG(NetworkCacheSpeculativePreloading, &quot;Cannot reuse speculatively validated entry because HTTP headers used for validation do not match&quot;);
</span><span class="cx"> #if !LOG_DISABLED
</span><del>-        dumpHTTPHeadersDiff(headersA, headersB);
</del><ins>+        dumpHTTPHeadersDiff(speculativeRequest.httpHeaderFields(), actualRequest.httpHeaderFields());
</ins><span class="cx"> #endif
</span><span class="cx">         return false;
</span><span class="cx">     }
</span></span></pre>
</div>
</div>

</body>
</html>