Changeset 239974 in webkit
- Timestamp:
- Jan 14, 2019, 9:15:57 PM (7 years ago)
- Location:
- trunk/Source
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r239971 r239974 1 2019-01-14 Alex Christensen <achristensen@webkit.org> 2 3 Split headerValueForVary into specialized functions for NetworkProcess and WebProcess/WebKitLegacy 4 https://bugs.webkit.org/show_bug.cgi?id=193429 5 6 Reviewed by Joseph Pecoraro. 7 8 headerValueForVary is a strange function that is causing trouble with my NetworkProcess global state removal project. 9 It currently accesses the cookie storage to see if there's a match in two different ways currently written as fallbacks. 10 In the WebProcess or in WebKitLegacy, it uses cookiesStrategy to access cookies via IPC or directly, respectively, 11 depending on the PlatformStrategies implementation of cookiesStrategy for that process. 12 In the NetworkProcess, it uses WebCore::NetworkStorageSession to access cookies directly. 13 Both of these cookie accessing methods use global state in the process, and I must split them to refactor them separately. 14 This patch does the split by passing in the method of cookie access: a CookiesStrategy& or a NetworkStorageSession&. 15 Further refactoring will be done in bug 193368 and bug 161106 to build on this and replace the global state with 16 member variables of the correct containing objects. 17 18 * loader/cache/CachedResource.cpp: 19 (WebCore::CachedResource::setResponse): 20 (WebCore::CachedResource::varyHeaderValuesMatch): 21 * platform/network/CacheValidation.cpp: 22 (WebCore::cookieRequestHeaderFieldValue): 23 (WebCore::headerValueForVary): 24 (WebCore::collectVaryingRequestHeaders): 25 (WebCore::verifyVaryingRequestHeaders): 26 * platform/network/CacheValidation.h: 27 1 28 2019-01-14 Simon Fraser <simon.fraser@apple.com> 2 29 -
trunk/Source/WebCore/loader/cache/CachedResource.cpp
r239634 r239974 477 477 ASSERT(m_response.type() == ResourceResponse::Type::Default); 478 478 m_response = response; 479 m_varyingHeaderValues = collectVaryingRequestHeaders( m_resourceRequest, m_response, m_sessionID);479 m_varyingHeaderValues = collectVaryingRequestHeaders(*platformStrategies()->cookiesStrategy(), m_resourceRequest, m_response, m_sessionID); 480 480 481 481 #if ENABLE(SERVICE_WORKER) … … 859 859 return true; 860 860 861 return verifyVaryingRequestHeaders( m_varyingHeaderValues, request, m_sessionID);861 return verifyVaryingRequestHeaders(*platformStrategies()->cookiesStrategy(), m_varyingHeaderValues, request, m_sessionID); 862 862 } 863 863 -
trunk/Source/WebCore/platform/network/CacheValidation.cpp
r239461 r239974 327 327 } 328 328 329 static String headerValueForVary(const ResourceRequest& request, const String& headerName, PAL::SessionID sessionID) 329 static String cookieRequestHeaderFieldValue(const NetworkStorageSession& session, const ResourceRequest& request) 330 { 331 return session.cookieRequestHeaderFieldValue(request.firstPartyForCookies(), SameSiteInfo::create(request), request.url(), WTF::nullopt, WTF::nullopt, request.url().protocolIs("https") ? IncludeSecureCookies::Yes : IncludeSecureCookies::No).first; 332 } 333 334 static String cookieRequestHeaderFieldValue(CookiesStrategy& cookiesStrategy, const PAL::SessionID& sessionID, const ResourceRequest& request) 335 { 336 return cookiesStrategy.cookieRequestHeaderFieldValue(sessionID, request.firstPartyForCookies(), SameSiteInfo::create(request), request.url(), WTF::nullopt, WTF::nullopt, request.url().protocolIs("https") ? IncludeSecureCookies::Yes : IncludeSecureCookies::No).first; 337 } 338 339 static String headerValueForVary(const ResourceRequest& request, const String& headerName, Function<String()>&& cookieRequestHeaderFieldValueFunction) 330 340 { 331 341 // Explicit handling for cookies is needed because they are added magically by the networking layer. … … 333 343 // We could fetch the cookie when making the request but that seems overkill as the case is very rare and it 334 344 // is a blocking operation. This should be sufficient to cover reasonable cases. 335 if (headerName == httpHeaderNameString(HTTPHeaderName::Cookie)) { 336 auto includeSecureCookies = request.url().protocolIs("https") ? IncludeSecureCookies::Yes : IncludeSecureCookies::No; 337 auto* cookieStrategy = platformStrategies() ? platformStrategies()->cookiesStrategy() : nullptr; 338 if (!cookieStrategy) { 339 ASSERT(sessionID == PAL::SessionID::defaultSessionID()); 340 return NetworkStorageSession::defaultStorageSession().cookieRequestHeaderFieldValue(request.firstPartyForCookies(), SameSiteInfo::create(request), request.url(), WTF::nullopt, WTF::nullopt, includeSecureCookies).first; 341 } 342 return cookieStrategy->cookieRequestHeaderFieldValue(sessionID, request.firstPartyForCookies(), SameSiteInfo::create(request), request.url(), WTF::nullopt, WTF::nullopt, includeSecureCookies).first; 343 } 345 if (headerName == httpHeaderNameString(HTTPHeaderName::Cookie)) 346 return cookieRequestHeaderFieldValueFunction(); 344 347 return request.httpHeaderField(headerName); 345 348 } 346 349 347 Vector<std::pair<String, String>> collectVaryingRequestHeaders(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, PAL::SessionID sessionID)348 { 349 String varyValue = response.httpHeaderField( WebCore::HTTPHeaderName::Vary);350 static Vector<std::pair<String, String>> collectVaryingRequestHeadersInternal(const ResourceResponse& response, Function<String(const String& headerName)>&& headerValueForVaryFunction) 351 { 352 String varyValue = response.httpHeaderField(HTTPHeaderName::Vary); 350 353 if (varyValue.isEmpty()) 351 354 return { }; … … 355 358 for (auto& varyHeaderName : varyingHeaderNames) { 356 359 String headerName = varyHeaderName.stripWhiteSpace(); 357 String headerValue = headerValueForVary (request, headerName, sessionID);360 String headerValue = headerValueForVaryFunction(headerName); 358 361 varyingRequestHeaders.append(std::make_pair(headerName, headerValue)); 359 362 } … … 361 364 } 362 365 363 bool verifyVaryingRequestHeaders(const Vector<std::pair<String, String>>& varyingRequestHeaders, const WebCore::ResourceRequest& request, PAL::SessionID sessionID) 366 Vector<std::pair<String, String>> collectVaryingRequestHeaders(NetworkStorageSession& storageSession, const ResourceRequest& request, const ResourceResponse& response) 367 { 368 return collectVaryingRequestHeadersInternal(response, [&] (const String& headerName) { 369 return headerValueForVary(request, headerName, [&] { 370 return cookieRequestHeaderFieldValue(storageSession, request); 371 }); 372 }); 373 } 374 375 Vector<std::pair<String, String>> collectVaryingRequestHeaders(CookiesStrategy& cookiesStrategy, const ResourceRequest& request, const ResourceResponse& response, const PAL::SessionID& sessionID) 376 { 377 return collectVaryingRequestHeadersInternal(response, [&] (const String& headerName) { 378 return headerValueForVary(request, headerName, [&] { 379 return cookieRequestHeaderFieldValue(cookiesStrategy, sessionID, request); 380 }); 381 }); 382 } 383 384 static bool verifyVaryingRequestHeadersInternal(const Vector<std::pair<String, String>>& varyingRequestHeaders, Function<String(const String&)>&& headerValueForVary) 364 385 { 365 386 for (auto& varyingRequestHeader : varyingRequestHeaders) { … … 367 388 if (varyingRequestHeader.first == "*") 368 389 return false; 369 String headerValue = headerValueForVary(request, varyingRequestHeader.first, sessionID); 370 if (headerValue != varyingRequestHeader.second) 390 if (headerValueForVary(varyingRequestHeader.first) != varyingRequestHeader.second) 371 391 return false; 372 392 } 373 393 return true; 394 } 395 396 bool verifyVaryingRequestHeaders(NetworkStorageSession& storageSession, const Vector<std::pair<String, String>>& varyingRequestHeaders, const ResourceRequest& request) 397 { 398 return verifyVaryingRequestHeadersInternal(varyingRequestHeaders, [&] (const String& headerName) { 399 return headerValueForVary(request, headerName, [&] { 400 return cookieRequestHeaderFieldValue(storageSession, request); 401 }); 402 }); 403 } 404 405 bool verifyVaryingRequestHeaders(CookiesStrategy& cookiesStrategy, const Vector<std::pair<String, String>>& varyingRequestHeaders, const ResourceRequest& request, const PAL::SessionID& sessionID) 406 { 407 return verifyVaryingRequestHeadersInternal(varyingRequestHeaders, [&] (const String& headerName) { 408 return headerValueForVary(request, headerName, [&] { 409 return cookieRequestHeaderFieldValue(cookiesStrategy, sessionID, request); 410 }); 411 }); 374 412 } 375 413 -
trunk/Source/WebCore/platform/network/CacheValidation.h
r235911 r239974 35 35 namespace WebCore { 36 36 37 class CookiesStrategy; 37 38 class HTTPHeaderMap; 39 class NetworkStorageSession; 38 40 class ResourceRequest; 39 41 class ResourceResponse; … … 78 80 WEBCORE_EXPORT CacheControlDirectives parseCacheControlDirectives(const HTTPHeaderMap&); 79 81 80 WEBCORE_EXPORT Vector<std::pair<String, String>> collectVaryingRequestHeaders(const ResourceRequest&, const ResourceResponse&, PAL::SessionID = PAL::SessionID::defaultSessionID()); 81 WEBCORE_EXPORT bool verifyVaryingRequestHeaders(const Vector<std::pair<String, String>>& varyingRequestHeaders, const ResourceRequest&, PAL::SessionID = PAL::SessionID::defaultSessionID()); 82 WEBCORE_EXPORT Vector<std::pair<String, String>> collectVaryingRequestHeaders(NetworkStorageSession&, const ResourceRequest&, const ResourceResponse&); 83 WEBCORE_EXPORT Vector<std::pair<String, String>> collectVaryingRequestHeaders(CookiesStrategy&, const ResourceRequest&, const ResourceResponse&, const PAL::SessionID&); 84 WEBCORE_EXPORT bool verifyVaryingRequestHeaders(NetworkStorageSession&, const Vector<std::pair<String, String>>& varyingRequestHeaders, const ResourceRequest&); 85 WEBCORE_EXPORT bool verifyVaryingRequestHeaders(CookiesStrategy&, const Vector<std::pair<String, String>>& varyingRequestHeaders, const ResourceRequest&, const PAL::SessionID&); 82 86 83 87 WEBCORE_EXPORT bool isStatusCodeCacheableByDefault(int statusCode); -
trunk/Source/WebKit/ChangeLog
r239972 r239974 1 2019-01-14 Alex Christensen <achristensen@webkit.org> 2 3 Split headerValueForVary into specialized functions for NetworkProcess and WebProcess/WebKitLegacy 4 https://bugs.webkit.org/show_bug.cgi?id=193429 5 6 Reviewed by Joseph Pecoraro. 7 8 * NetworkProcess/cache/NetworkCache.cpp: 9 (WebKit::NetworkCache::makeUseDecision): 10 (WebKit::NetworkCache::Cache::retrieve): 11 (WebKit::NetworkCache::Cache::makeEntry): 12 (WebKit::NetworkCache::Cache::makeRedirectEntry): 13 (WebKit::NetworkCache::Cache::update): 14 1 15 2019-01-14 Tim Horton <timothy_horton@apple.com> 2 16 -
trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.cpp
r239759 r239974 192 192 return UseDecision::Validate; 193 193 194 if (!WebCore::verifyVaryingRequestHeaders( entry.varyingRequestHeaders(), request))194 if (!WebCore::verifyVaryingRequestHeaders(WebCore::NetworkStorageSession::defaultStorageSession(), entry.varyingRequestHeaders(), request)) 195 195 return UseDecision::NoDueToVaryingHeaderMismatch; 196 196 … … 308 308 m_speculativeLoadManager->retrieve(storageKey, [request, completionHandler = WTFMove(completionHandler), info = WTFMove(info)](std::unique_ptr<Entry> entry) mutable { 309 309 info.wasSpeculativeLoad = true; 310 if (entry && WebCore::verifyVaryingRequestHeaders( entry->varyingRequestHeaders(), request))310 if (entry && WebCore::verifyVaryingRequestHeaders(WebCore::NetworkStorageSession::defaultStorageSession(), entry->varyingRequestHeaders(), request)) 311 311 completeRetrieve(WTFMove(completionHandler), WTFMove(entry), info); 312 312 else … … 365 365 std::unique_ptr<Entry> Cache::makeEntry(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, RefPtr<WebCore::SharedBuffer>&& responseData) 366 366 { 367 return std::make_unique<Entry>(makeCacheKey(request), response, WTFMove(responseData), WebCore::collectVaryingRequestHeaders( request, response));367 return std::make_unique<Entry>(makeCacheKey(request), response, WTFMove(responseData), WebCore::collectVaryingRequestHeaders(WebCore::NetworkStorageSession::defaultStorageSession(), request, response)); 368 368 } 369 369 370 370 std::unique_ptr<Entry> Cache::makeRedirectEntry(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, const WebCore::ResourceRequest& redirectRequest) 371 371 { 372 return std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, WebCore::collectVaryingRequestHeaders( request, response));372 return std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, WebCore::collectVaryingRequestHeaders(WebCore::NetworkStorageSession::defaultStorageSession(), request, response)); 373 373 } 374 374 … … 454 454 WebCore::updateResponseHeadersAfterRevalidation(response, validatingResponse); 455 455 456 auto updateEntry = std::make_unique<Entry>(existingEntry.key(), response, existingEntry.buffer(), WebCore::collectVaryingRequestHeaders( originalRequest, response));456 auto updateEntry = std::make_unique<Entry>(existingEntry.key(), response, existingEntry.buffer(), WebCore::collectVaryingRequestHeaders(WebCore::NetworkStorageSession::defaultStorageSession(), originalRequest, response)); 457 457 auto updateRecord = updateEntry->encodeAsStorageRecord(); 458 458
Note:
See TracChangeset
for help on using the changeset viewer.