bool CachedRawResource::canReuse(const ResourceRequest& newRequest) const { if (dataBufferingPolicy() == DoNotBufferData) return false; if (m_resourceRequest.httpMethod() != newRequest.httpMethod()) return false; if (m_resourceRequest.httpBody() != newRequest.httpBody()) return false; if (m_resourceRequest.allowCookies() != newRequest.allowCookies()) return false; if (newRequest.isConditional()) return false; // Ensure most headers match the existing headers before continuing. // Note that the list of ignored headers includes some headers explicitly related to caching. // A more detailed check of caching policy will be performed later, this is simply a list of // headers that we might permit to be different and still reuse the existing CachedResource. const HTTPHeaderMap& newHeaders = newRequest.httpHeaderFields(); const HTTPHeaderMap& oldHeaders = m_resourceRequest.httpHeaderFields(); for (const auto& header : newHeaders) { if (header.keyAsHTTPHeaderName) { if (!shouldIgnoreHeaderForCacheReuse(header.keyAsHTTPHeaderName.value()) && header.value != oldHeaders.commonHeaders().get(header.keyAsHTTPHeaderName.value())) return false; } else if (header.value != oldHeaders.uncommonHeaders().get(header.key)) return false; } // For this second loop, we don't actually need to compare values, checking that the // key is contained in newHeaders is sufficient due to the previous loop. for (const auto& header : oldHeaders) { if (header.keyAsHTTPHeaderName) { if (!shouldIgnoreHeaderForCacheReuse(header.keyAsHTTPHeaderName.value()) && !newHeaders.commonHeaders().contains(header.keyAsHTTPHeaderName.value())) return false; } else if (!newHeaders.uncommonHeaders().contains(header.key)) return false; } return true; }
bool CachedRawResource::canReuse(const ResourceRequest& newRequest) const { if (m_options.dataBufferingPolicy() == DoNotBufferData) return false; if (m_resourceRequest.httpMethod() != newRequest.httpMethod()) return false; if (m_resourceRequest.httpBody() != newRequest.httpBody()) return false; if (m_resourceRequest.allowCookies() != newRequest.allowCookies()) return false; // Ensure most headers match the existing headers before continuing. // Note that the list of ignored headers includes some headers explicitly related to caching. // A more detailed check of caching policy will be performed later, this is simply a list of // headers that we might permit to be different and still reuse the existing CachedResource. const HTTPHeaderMap& newHeaders = newRequest.httpHeaderFields(); const HTTPHeaderMap& oldHeaders = m_resourceRequest.httpHeaderFields(); for (const auto& header : newHeaders) { if (!shouldIgnoreHeaderForCacheReuse(header.key) && header.value != oldHeaders.get(header.key)) return false; } for (const auto& header : oldHeaders) { if (!shouldIgnoreHeaderForCacheReuse(header.key) && header.value != newHeaders.get(header.key)) return false; } for (size_t i = 0; i < m_redirectChain.size(); i++) { if (m_redirectChain[i].m_redirectResponse.cacheControlContainsNoStore()) return false; } return true; }