<!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>[169811] trunk/Source/WebCore</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/169811">169811</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-06-11 10:27:30 -0700 (Wed, 11 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Curl] Empty headers in request response.
https://bugs.webkit.org/show_bug.cgi?id=133483

Patch by peavo@outlook.com &lt;peavo@outlook.com&gt; on 2014-06-11
Reviewed by Brent Fulgham.

When a request is taken from the cache, its cached response headers are empty, if the cache entry was created in the same session.
It is only when the cache entry is loaded from disc, that the response headers are properly set.
We need to set the cached response headers in both cases.
There is also an issue if two jobs are loading the same url at the same time.
Both jobs will then write to the cache content file, and create invalid content.
This can be fixed by only letting the first request write to the content file.

* platform/network/curl/CurlCacheEntry.cpp:
(WebCore::CurlCacheEntry::CurlCacheEntry):
(WebCore::CurlCacheEntry::isLoading): Added method to check if cache entry is loading the content.
(WebCore::CurlCacheEntry::saveResponseHeaders): Set the cached response headers when response is saved.
(WebCore::CurlCacheEntry::invalidate): To be on the safe side, close content file when entry is invalidated.
(WebCore::CurlCacheEntry::parseResponseHeaders): Made parameter const.
* platform/network/curl/CurlCacheEntry.h: Keep track of which job is creating this cache entry.
(WebCore::CurlCacheEntry::getJob):
* platform/network/curl/CurlCacheManager.cpp:
(WebCore::CurlCacheManager::loadIndex): When cache entry is loaded from disc, there is no associated job.
(WebCore::CurlCacheManager::didReceiveResponse): Bail out if cache entry is already currently loading,
otherwise associate this job with the new cache entry.
(WebCore::CurlCacheManager::didFinishLoading): Changed parameter type.
(WebCore::CurlCacheManager::isCached): Don't report the url as cached if it's currently loading content.
(WebCore::CurlCacheManager::didReceiveData): Don't write to the content file if the entry is not associated with the job.
(WebCore::CurlCacheManager::didFail): Changed parameter type.
* platform/network/curl/CurlCacheManager.h: Changed parameter type.
* platform/network/curl/ResourceHandleManager.cpp: Ditto.
(WebCore::writeCallback):
(WebCore::ResourceHandleManager::downloadTimerCallback):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlCacheEntrycpp">trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlCacheEntryh">trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlCacheManagercpp">trunk/Source/WebCore/platform/network/curl/CurlCacheManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlCacheManagerh">trunk/Source/WebCore/platform/network/curl/CurlCacheManager.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlResourceHandleManagercpp">trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169810 => 169811)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-11 17:03:20 UTC (rev 169810)
+++ trunk/Source/WebCore/ChangeLog        2014-06-11 17:27:30 UTC (rev 169811)
</span><span class="lines">@@ -1,3 +1,38 @@
</span><ins>+2014-06-11  peavo@outlook.com  &lt;peavo@outlook.com&gt;
+
+        [Curl] Empty headers in request response.
+        https://bugs.webkit.org/show_bug.cgi?id=133483
+
+        Reviewed by Brent Fulgham.
+
+        When a request is taken from the cache, its cached response headers are empty, if the cache entry was created in the same session.
+        It is only when the cache entry is loaded from disc, that the response headers are properly set.
+        We need to set the cached response headers in both cases.
+        There is also an issue if two jobs are loading the same url at the same time.
+        Both jobs will then write to the cache content file, and create invalid content.
+        This can be fixed by only letting the first request write to the content file.
+
+        * platform/network/curl/CurlCacheEntry.cpp:
+        (WebCore::CurlCacheEntry::CurlCacheEntry):
+        (WebCore::CurlCacheEntry::isLoading): Added method to check if cache entry is loading the content.
+        (WebCore::CurlCacheEntry::saveResponseHeaders): Set the cached response headers when response is saved.
+        (WebCore::CurlCacheEntry::invalidate): To be on the safe side, close content file when entry is invalidated.
+        (WebCore::CurlCacheEntry::parseResponseHeaders): Made parameter const.
+        * platform/network/curl/CurlCacheEntry.h: Keep track of which job is creating this cache entry.
+        (WebCore::CurlCacheEntry::getJob):
+        * platform/network/curl/CurlCacheManager.cpp:
+        (WebCore::CurlCacheManager::loadIndex): When cache entry is loaded from disc, there is no associated job.
+        (WebCore::CurlCacheManager::didReceiveResponse): Bail out if cache entry is already currently loading,
+        otherwise associate this job with the new cache entry.
+        (WebCore::CurlCacheManager::didFinishLoading): Changed parameter type.
+        (WebCore::CurlCacheManager::isCached): Don't report the url as cached if it's currently loading content.
+        (WebCore::CurlCacheManager::didReceiveData): Don't write to the content file if the entry is not associated with the job.
+        (WebCore::CurlCacheManager::didFail): Changed parameter type.
+        * platform/network/curl/CurlCacheManager.h: Changed parameter type.
+        * platform/network/curl/ResourceHandleManager.cpp: Ditto.
+        (WebCore::writeCallback):
+        (WebCore::ResourceHandleManager::downloadTimerCallback):
+
</ins><span class="cx"> 2014-06-11  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r133705): Layout Test js/dom/webidl-type-mapping.html is failing
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlCacheEntrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp (169810 => 169811)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp        2014-06-11 17:03:20 UTC (rev 169810)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.cpp        2014-06-11 17:27:30 UTC (rev 169811)
</span><span class="lines">@@ -45,13 +45,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-CurlCacheEntry::CurlCacheEntry(const String&amp; url, const String&amp; cacheDir)
</del><ins>+CurlCacheEntry::CurlCacheEntry(const String&amp; url, ResourceHandle* job, const String&amp; cacheDir)
</ins><span class="cx">     : m_headerFilename(cacheDir)
</span><span class="cx">     , m_contentFilename(cacheDir)
</span><span class="cx">     , m_contentFile(invalidPlatformFileHandle)
</span><span class="cx">     , m_entrySize(0)
</span><span class="cx">     , m_expireDate(-1)
</span><span class="cx">     , m_headerParsed(false)
</span><ins>+    , m_job(job)
</ins><span class="cx"> {
</span><span class="cx">     generateBaseFilename(url.latin1());
</span><span class="cx"> 
</span><span class="lines">@@ -67,6 +68,11 @@
</span><span class="cx">     closeContentFile();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool CurlCacheEntry::isLoading()
+{
+    return isHandleValid(m_contentFile);
+}
+
</ins><span class="cx"> // Cache manager should invalidate the entry on false
</span><span class="cx"> bool CurlCacheEntry::isCached()
</span><span class="cx"> {
</span><span class="lines">@@ -112,7 +118,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CurlCacheEntry::saveResponseHeaders(ResourceResponse&amp; response)
</del><ins>+bool CurlCacheEntry::saveResponseHeaders(const ResourceResponse&amp; response)
</ins><span class="cx"> {
</span><span class="cx">     PlatformFileHandle headerFile = openFile(m_headerFilename, OpenForWrite);
</span><span class="cx">     if (!isHandleValid(headerFile)) {
</span><span class="lines">@@ -130,6 +136,7 @@
</span><span class="cx">         headerField.append(&quot;\n&quot;);
</span><span class="cx">         CString headerFieldLatin1 = headerField.latin1();
</span><span class="cx">         writeToFile(headerFile, headerFieldLatin1.data(), headerFieldLatin1.length());
</span><ins>+        m_cachedResponse.setHTTPHeaderField(it-&gt;key, it-&gt;value);
</ins><span class="cx">         ++it;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -253,12 +260,13 @@
</span><span class="cx"> 
</span><span class="cx"> void CurlCacheEntry::invalidate()
</span><span class="cx"> {
</span><ins>+    closeContentFile();
</ins><span class="cx">     deleteFile(m_headerFilename);
</span><span class="cx">     deleteFile(m_contentFilename);
</span><span class="cx">     LOG(Network, &quot;Cache: invalidated %s\n&quot;, m_basename.latin1().data());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CurlCacheEntry::parseResponseHeaders(ResourceResponse&amp; response)
</del><ins>+bool CurlCacheEntry::parseResponseHeaders(const ResourceResponse&amp; response)
</ins><span class="cx"> {
</span><span class="cx">     double fileTime;
</span><span class="cx">     time_t fileModificationDate;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlCacheEntryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h (169810 => 169811)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h        2014-06-11 17:03:20 UTC (rev 169810)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheEntry.h        2014-06-11 17:27:30 UTC (rev 169811)
</span><span class="lines">@@ -41,25 +41,28 @@
</span><span class="cx"> class CurlCacheEntry {
</span><span class="cx"> 
</span><span class="cx"> public:
</span><del>-    CurlCacheEntry(const String&amp; url, const String&amp; cacheDir);
</del><ins>+    CurlCacheEntry(const String&amp; url, ResourceHandle* job, const String&amp; cacheDir);
</ins><span class="cx">     ~CurlCacheEntry();
</span><span class="cx"> 
</span><span class="cx">     bool isCached();
</span><ins>+    bool isLoading();
</ins><span class="cx">     size_t entrySize();
</span><span class="cx">     HTTPHeaderMap&amp; requestHeaders() { return m_requestHeaders; }
</span><span class="cx"> 
</span><span class="cx">     bool saveCachedData(const char* data, size_t);
</span><span class="cx">     bool readCachedData(ResourceHandle*);
</span><span class="cx"> 
</span><del>-    bool saveResponseHeaders(ResourceResponse&amp;);
</del><ins>+    bool saveResponseHeaders(const ResourceResponse&amp;);
</ins><span class="cx">     void setResponseFromCachedHeaders(ResourceResponse&amp;);
</span><span class="cx"> 
</span><span class="cx">     void invalidate();
</span><span class="cx">     void didFail();
</span><span class="cx">     void didFinishLoading();
</span><span class="cx"> 
</span><del>-    bool parseResponseHeaders(ResourceResponse&amp;);
</del><ins>+    bool parseResponseHeaders(const ResourceResponse&amp;);
</ins><span class="cx"> 
</span><ins>+    const ResourceHandle* getJob() const { return m_job; }
+
</ins><span class="cx"> private:
</span><span class="cx">     String m_basename;
</span><span class="cx">     String m_headerFilename;
</span><span class="lines">@@ -74,6 +77,8 @@
</span><span class="cx">     ResourceResponse m_cachedResponse;
</span><span class="cx">     HTTPHeaderMap m_requestHeaders;
</span><span class="cx"> 
</span><ins>+    ResourceHandle* m_job;
+
</ins><span class="cx">     void generateBaseFilename(const CString&amp; url);
</span><span class="cx">     bool loadFileToBuffer(const String&amp; filepath, Vector&lt;char&gt;&amp; buffer);
</span><span class="cx">     bool loadResponseHeaders();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlCacheManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheManager.cpp (169810 => 169811)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlCacheManager.cpp        2014-06-11 17:03:20 UTC (rev 169810)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheManager.cpp        2014-06-11 17:27:30 UTC (rev 169811)
</span><span class="lines">@@ -139,7 +139,7 @@
</span><span class="cx">         --end; // Last line is empty
</span><span class="cx">     while (it != end) {
</span><span class="cx">         String url = it-&gt;stripWhiteSpace();
</span><del>-        std::unique_ptr&lt;CurlCacheEntry&gt; cacheEntry(new CurlCacheEntry(url, m_cacheDir));
</del><ins>+        auto cacheEntry = std::make_unique&lt;CurlCacheEntry&gt;(url, nullptr, m_cacheDir);
</ins><span class="cx"> 
</span><span class="cx">         if (cacheEntry-&gt;isCached() &amp;&amp; cacheEntry-&gt;entrySize() &lt; m_storageSizeLimit) {
</span><span class="cx">             m_currentStorageSize += cacheEntry-&gt;entrySize();
</span><span class="lines">@@ -191,25 +191,29 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CurlCacheManager::didReceiveResponse(ResourceHandle* job, ResourceResponse&amp; response)
</del><ins>+void CurlCacheManager::didReceiveResponse(ResourceHandle&amp; job, ResourceResponse&amp; response)
</ins><span class="cx"> {
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ResourceHandleInternal* d = job-&gt;getInternal();
</del><ins>+    ResourceHandleInternal* d = job.getInternal();
</ins><span class="cx">     if (d-&gt;m_cancelled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    String url = job-&gt;firstRequest().url().string();
</del><ins>+    const String&amp; url = job.firstRequest().url().string();
</ins><span class="cx"> 
</span><span class="cx">     if (response.httpStatusCode() == 304) {
</span><del>-        readCachedData(url, job, response);
</del><ins>+        readCachedData(url, &amp;job, response);
</ins><span class="cx">         m_LRUEntryList.prependOrMoveToFirst(url);
</span><span class="cx">     }
</span><span class="cx">     else if (response.httpStatusCode() == 200) {
</span><ins>+        auto it = m_index.find(url);
+        if (it != m_index.end() &amp;&amp; it-&gt;value-&gt;isLoading())
+            return;
+
</ins><span class="cx">         invalidateCacheEntry(url); // Invalidate existing entry on 200
</span><span class="cx"> 
</span><del>-        std::unique_ptr&lt;CurlCacheEntry&gt; cacheEntry(new CurlCacheEntry(url, m_cacheDir));
</del><ins>+        auto cacheEntry = std::make_unique&lt;CurlCacheEntry&gt;(url, &amp;job, m_cacheDir);
</ins><span class="cx">         bool cacheable = cacheEntry-&gt;parseResponseHeaders(response);
</span><span class="cx">         if (cacheable) {
</span><span class="cx">             m_LRUEntryList.prependOrMoveToFirst(url);
</span><span class="lines">@@ -220,12 +224,14 @@
</span><span class="cx">         invalidateCacheEntry(url);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CurlCacheManager::didFinishLoading(const String&amp; url)
</del><ins>+void CurlCacheManager::didFinishLoading(ResourceHandle&amp; job)
</ins><span class="cx"> {
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    const String&amp; url = job.firstRequest().url().string();
+
+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end())
</span><span class="cx">         it-&gt;value-&gt;didFinishLoading();
</span><span class="cx"> }
</span><span class="lines">@@ -235,10 +241,10 @@
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end()) {
</span><span class="cx">         if (it-&gt;value-&gt;isCached())
</span><del>-            return true;
</del><ins>+            return !it-&gt;value-&gt;isLoading();
</ins><span class="cx"> 
</span><span class="cx">         invalidateCacheEntry(url);
</span><span class="cx">     }
</span><span class="lines">@@ -253,7 +259,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool CurlCacheManager::getCachedResponse(const String&amp; url, ResourceResponse&amp; response)
</span><span class="cx"> {
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end()) {
</span><span class="cx">         it-&gt;value-&gt;setResponseFromCachedHeaders(response);
</span><span class="cx">         return true;
</span><span class="lines">@@ -261,13 +267,18 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CurlCacheManager::didReceiveData(const String&amp; url, const char* data, size_t size)
</del><ins>+void CurlCacheManager::didReceiveData(ResourceHandle&amp; job, const char* data, size_t size)
</ins><span class="cx"> {
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    const String&amp; url = job.firstRequest().url().string();
+
+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end()) {
</span><ins>+        if (it-&gt;value-&gt;getJob() != &amp;job)
+            return;
+
</ins><span class="cx">         if (!it-&gt;value-&gt;saveCachedData(data, size))
</span><span class="cx">             invalidateCacheEntry(url);
</span><span class="cx"> 
</span><span class="lines">@@ -284,7 +295,7 @@
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end())
</span><span class="cx">         if (!it-&gt;value-&gt;saveResponseHeaders(response))
</span><span class="cx">             invalidateCacheEntry(url);
</span><span class="lines">@@ -295,7 +306,7 @@
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end()) {
</span><span class="cx">         if (m_currentStorageSize &lt; it-&gt;value-&gt;entrySize())
</span><span class="cx">             m_currentStorageSize = 0;
</span><span class="lines">@@ -308,8 +319,10 @@
</span><span class="cx">     m_LRUEntryList.remove(url);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CurlCacheManager::didFail(const String&amp; url)
</del><ins>+void CurlCacheManager::didFail(ResourceHandle &amp;job)
</ins><span class="cx"> {
</span><ins>+    const String&amp; url = job.firstRequest().url().string();
+
</ins><span class="cx">     invalidateCacheEntry(url);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -318,7 +331,7 @@
</span><span class="cx">     if (m_disabled)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    HashMap&lt;String, std::unique_ptr&lt;CurlCacheEntry&gt;&gt;::iterator it = m_index.find(url);
</del><ins>+    auto it = m_index.find(url);
</ins><span class="cx">     if (it != m_index.end()) {
</span><span class="cx">         it-&gt;value-&gt;setResponseFromCachedHeaders(response);
</span><span class="cx">         m_LRUEntryList.prependOrMoveToFirst(url);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlCacheManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlCacheManager.h (169810 => 169811)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlCacheManager.h        2014-06-11 17:03:20 UTC (rev 169810)
+++ trunk/Source/WebCore/platform/network/curl/CurlCacheManager.h        2014-06-11 17:27:30 UTC (rev 169811)
</span><span class="lines">@@ -49,10 +49,10 @@
</span><span class="cx">     HTTPHeaderMap&amp; requestHeaders(const String&amp;); // Load headers
</span><span class="cx">     bool getCachedResponse(const String&amp; url, ResourceResponse&amp;);
</span><span class="cx"> 
</span><del>-    void didReceiveResponse(ResourceHandle*, ResourceResponse&amp;);
-    void didReceiveData(const String&amp;, const char*, size_t); // Save data
-    void didFinishLoading(const String&amp;);
-    void didFail(const String&amp;);
</del><ins>+    void didReceiveResponse(ResourceHandle&amp;, ResourceResponse&amp;);
+    void didReceiveData(ResourceHandle&amp;, const char*, size_t); // Save data
+    void didFinishLoading(ResourceHandle&amp;);
+    void didFail(ResourceHandle&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     CurlCacheManager();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlResourceHandleManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp (169810 => 169811)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp        2014-06-11 17:03:20 UTC (rev 169810)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleManager.cpp        2014-06-11 17:27:30 UTC (rev 169811)
</span><span class="lines">@@ -325,7 +325,7 @@
</span><span class="cx">         d-&gt;m_multipartHandle-&gt;contentReceived(static_cast&lt;const char*&gt;(ptr), totalSize);
</span><span class="cx">     else if (d-&gt;client()) {
</span><span class="cx">         d-&gt;client()-&gt;didReceiveData(job, static_cast&lt;char*&gt;(ptr), totalSize, 0);
</span><del>-        CurlCacheManager::getInstance().didReceiveData(job-&gt;firstRequest().url().string(), static_cast&lt;char*&gt;(ptr), totalSize);
</del><ins>+        CurlCacheManager::getInstance().didReceiveData(*job, static_cast&lt;char*&gt;(ptr), totalSize);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return totalSize;
</span><span class="lines">@@ -537,7 +537,7 @@
</span><span class="cx">                 CurlCacheManager::getInstance().getCachedResponse(url, d-&gt;m_response);
</span><span class="cx">             }
</span><span class="cx">             client-&gt;didReceiveResponse(job, d-&gt;m_response);
</span><del>-            CurlCacheManager::getInstance().didReceiveResponse(job, d-&gt;m_response);
</del><ins>+            CurlCacheManager::getInstance().didReceiveResponse(*job, d-&gt;m_response);
</ins><span class="cx">         }
</span><span class="cx">         d-&gt;m_response.setResponseFired(true);
</span><span class="cx"> 
</span><span class="lines">@@ -689,7 +689,7 @@
</span><span class="cx"> 
</span><span class="cx">             if (d-&gt;client()) {
</span><span class="cx">                 d-&gt;client()-&gt;didFinishLoading(job, 0);
</span><del>-                CurlCacheManager::getInstance().didFinishLoading(job-&gt;firstRequest().url().string());
</del><ins>+                CurlCacheManager::getInstance().didFinishLoading(*job);
</ins><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             char* url = 0;
</span><span class="lines">@@ -701,7 +701,7 @@
</span><span class="cx">                 ResourceError resourceError(String(), msg-&gt;data.result, String(url), String(curl_easy_strerror(msg-&gt;data.result)));
</span><span class="cx">                 resourceError.setSSLErrors(d-&gt;m_sslErrors);
</span><span class="cx">                 d-&gt;client()-&gt;didFail(job, resourceError);
</span><del>-                CurlCacheManager::getInstance().didFail(job-&gt;firstRequest().url().string());
</del><ins>+                CurlCacheManager::getInstance().didFail(*job);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>